共享和更新项目
fetch
从一个或多个存储库中获取分支和/或标记(统称为“refs”),以及完成其历史记录所需的对象。关联远程仓库的分支将会被更新。(即将远程仓库的文件同步到本地)
默认情况下,任何指向历史记录的标签也会被获取;其效果是获取指向您感兴趣的分支的标记。此默认行为可以通过使用--tags
或--no-tags
选项或配置remote.<name>. tagopt
。通过使用显式获取标记的refspec,也可以获取不指向您感兴趣的分支的标记。
git fetch
可以从单个指定的存储库或URL获取数据,也可以从多个存储库同时获取数据(如果给定<group>
并且有远程服务)。
选项
--all
:获取所有的远程仓库。-a; --append
:在.git/FETCH_HEAD
的现有内容中添加引用的ref名称和对象名称。如果没有这个选项,.git/FETCH_HEAD
中的旧数据将被覆盖。--atomic
:使用原子事务更新本地引用。要么更新所有引用,要么在错误时,不更新引用。--depth=<depth>
:限制从每个远程分支历史记录尖端获取指定数量的提交(commit)。--shallow-since=<date>
:深化或缩短浅层存储库的历史,以包括<date>
之后的所有可达提交。--shallow-exclude=<revision>
:深化或缩短浅层存储库的历史,以排除从指定的远程分支或标记可到达的提交。此选项可指定多次。--unshallow
:如果原仓库是完整的,则将一个缩短的仓库转变为一个完整的仓库,并且会移除所有加在该仓库上的缩短限制。-p; --prune
:在获取之前,删除在远程上已经不再存在的任何远程跟踪引用。如果只是因为默认的标签自动跟踪或--tags
选项而获取标签,那么标签就不会被删除。然而,如果获取标签是由于一个显式的refspec。-n; --no-tags
:默认情况下,指向从远程存储库下载的对象的标记将被获取并存储在本地。此选项禁用自动下载标记。repository>
:“远程”存储库,它是获取或拉取操作的源。这个参数可以是一个URL,也可以是远程服务器的名称。
pull
1 | git pull [<options>] [<repository> [<refspec>…]] |
将远程存储库中的更改合并到当前分支中。如果当前分支位于远程的版本之后,那么默认情况下,它将快进当前分支以匹配远程分支。如果当前分支和远程分支已经偏离,用户需要指定如何使用--rebase
或--no-rebase
协调偏离的分支。
更准确地说,git pull
运行带有给定参数的git fetch
,然后根据配置选项或命令行标志调用git rebase
或git merge
来协调分支。
<repository>
应该是传递给git-fetch
的远程存储库的名称。<refspec>
可以命名任意的远程引用(例如,标记的名称),甚至可以命名具有相应远程跟踪分支的引用集合(例如,refs/heads/*:refs/remotes/origin/*
),但通常它是远程存储库中的一个分支的名称。
<repository>
和<branch>
的默认值从当前分支的“remote”和“merge”配置中读取,由git-branch --track
设置。
与merge
相关的选项
--commit; --no-commit
:执行合并并提交结果。这个选项可以用来覆盖--no-commit
。只有在合并时才有用。使用
--no-commit
,执行合并并在创建合并提交之前停止,给用户一个机会在提交之前检查和进一步调整合并结果。--edit; -e; --no-edit
:在提交成功机械性合并前,打开编辑器来编辑自动生成的合并信息。--squash; --no-squash
:生成工作树和索引状态,就像发生了一个真正的合并(除了合并信息),但不实际做一个提交,移动HEAD,或记录$GIT_DIR/MERGE_HEAD
(导致下一个git commit命令创建一个合并提交)。这允许你在当前的分支上创建一个单独的提交,它的效果与合并另一个分支相同。--autostash; --no-autostash
:在操作开始之前自动创建一个临时stash
条目,将其记录在特殊的ref MERGE_AUTOSTASH
中,并在操作结束后应用它。这意味着您可以在脏工作树上运行操作。但是,使用时要小心:成功合并后的最终隐藏应用程序可能会导致重要的冲突。-r; --rebase[=false|true|merges|interactive]
:当为true时,在获取后将当前分支重设为上游分支的顶部。如果有一个与上游分支对应的远程跟踪分支,并且上游分支在上次获取后被重置基点,则rebase将使用该信息来避免重基非本地更改。当设置为
merge
时,使用git rebase --rebase-merge
进行rebase,这样本地合并提交就包含在rebase中。false
时,将上游分支合并到当前分支。interactive
时,启用rebase的交互模式。push
1 | git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>] |
使用本地引用更新远程引用,同时发送完成给定引用所必需的对象。
当命令行没有指定使用<repository>
参数推送的位置时,使用branch.*
。参考当前分支的远程配置,以确定在何处推送。如果缺少配置,则默认为origin。
当命令行没有指定使用<refspec>…
参数或--all
,--mirror
,--tags
选项,命令通过查找remote.*
找到默认的<refspec>
push配置,如果没有找到,则使用push .default
配置来决定推送什么
当命令行和配置文件中都没有指出推送到哪里,默认行为就会被执行,其流程为:当前分支被推送到对应上游分支,但是作为安全保障,如果上游分支不存在与本地同名的分支,则推送会被打断。
选项
<repository>
::“远程”仓库,它是push操作的目的地。这个参数可以是一个URL,也可以是远程服务器的名称。<refspec>…
:指定要用什么源对象更新什么目标引用。<refspec>
参数的格式是一个可选的加号+,后面跟着源对象<src>
,后面跟着一个冒号:,后面跟着目标ref<dst>
。<src>
通常是你想推送的分支的名称,但它可以是任意的“SHA-1表达式”,例如master~4或HEAD。--all
:推送所有分支(即refs/heads/
下的refs);不能与其他<refspec>
一起使用。--prune
:删除没有本地对应的远程分支。例如,如果本地分支tmp不再存在,则远程分支tmp将被删除。--mirror
:为当前仓库添加一个镜像仓库,即本地仓库所作的任何行为都会被同步到镜像仓库,如创建、更新、删除等。也可以在remote.<remote>.mirror
中配置。-d; --delete
:从远程存储库中删除所有列出的参考文献。这与在所有引用前面加上冒号是一样的。--[no-]atomic
:如果可用,在远程端使用原子事务。要么更新所有引用,要么在错误时,不更新引用。如果服务器不支持原子推送,推送将失败。--[no-]force-with-lease; --force-with-lease=<refname>; --force-with-lease=<refname>:<expect>
:通常,如果远程仓库不是本地仓库的祖先,则git push
会拒绝执行。如果远程ref的当前值与配置值匹配,则此选项将覆盖此限制。即可以向非祖先仓库推送。
-f; --force
:通常,该命令拒绝更新不是用于覆盖它的本地ref的祖先的远程ref。此外,当使用--force with-lease
选项时,该命令拒绝更新当前值不符合预期值的远程ref。此标志禁用这些检查,并可能导致远程存储库丢失提交;小心使用。
请注意
--force
适用于所有被推送的引用,因此将它与push.default
设置为匹配或多个推送目的地配置为remote.*
一起使用。push可以覆盖当前分支以外的引用。--[no-]force-if-includes
:只有当远程跟踪ref的尖端已在本地集成时,才强制更新。--repo=<repository>
:这个选项相当于<repository>
参数。如果这两个参数都指定了,命令行参数优先。-u; --set-upstream
:对于每个最新或成功推送的分支,添加upstream (tracking)
引用,该引用由无参数的git-pull
和其他命令使用。
例子
git push
:类似于git push <remote>
,其中<remote>
是当前分支的远端(或当如果没有为当前分支配置远端,即指origin
)。git push origin
:在不进行其他配置的情况下,将当前分支推送到已配置的上游(branch.<name>
)。合并配置变量),如果它与当前分支有相同的名称,并且错误输出而不推其他。git push origin :
:将匹配的分支推到origin
。git push origin master
:在源库中找到一个与master
匹配的ref(最有可能的是,它会找到ref /heads/master
),然后用它更新源库中相同的ref(例如ref /heads/master
)。如果master远程不存在,则会创建它。git push origin HEAD
:将当前分支推到远程上相同名称的方便方法。git push origin HEAD:master
:将当前分支推到origin仓库中匹配master的远程ref。这种形式可以方便地推送当前的分支,而无需考虑它的本地名称。git push origin :experimental
:在origin仓库中找到一个匹配experimental
的引用(例如refs/heads/experimental
),并删除它。git push origin +dev:master
:使用dev分支更新origin仓库的master分支,允许非快进更新。这可能会在origin仓库中留下未引用的提交。
remote
1 | git remote [-v | --verbose] |
管理当前分支追踪的远程仓库。
命令
add
:为<URL>
的存储库添加一个名为<name>
的远程服务器。然后,命令git fetch <name>
可以用来创建和更新远程跟踪分支<name>/<branch>
。- 使用-f选项,
git fetch <name>
将在远程信息建立之后立即运行。 - 使用
--tags
选项,git fetch <name>
从远程仓库导入每个标签。 - 使用
--no-tags
选项,git fetch <name>
不从远程仓库导入标签。
- 使用-f选项,
rename
:将远程仓库的名字从<old>
更改到<new>
。所有远程跟踪分支和远程的配置设置都会被更新。remove; rm
:移除名为<name>
的远程仓库。移除所有远程跟踪分支和远程配置设置。set-head
:设置或删除指定远程的默认分支(即-ref refs/remotes/<name>/HEAD
的目标)。不需要为远程设置默认分支,但允许指定远程的名称来代替特定的分支。例如,如果origin的默认分支设置为master,那么origin可以在你通常指定origin/master
的任何地方指定。set-branches
:更改指定远程跟踪的分支列表。这可用于在远程的初始设置之后跟踪可用远程分支的子集。命名分支将被解释为git remote add命令行上指定的-t选项。get-url
:检索远程服务器的url。insteadOf
和pushInsteadOf
的配置在这里展开。默认情况下,只列出第一个URL。set-url
:更改远程的url。为匹配regex <oldurl>
的remote<name>
设置第一个URL(如果没有给出<oldurl>
的第一个URL)为<newurl
>。如果<oldurl>
不匹配任何URL,则会发生错误,不做任何更改。show
:提供有关远程仓库<name>
的一些信息。prune
:删除与<name>
关联的过时引用。默认情况下,删除<name>
下陈旧的远程跟踪分支,但根据全局配置和远程的配置,我们甚至可能删除尚未推送到那里的本地标记。等价于git fetch --prune <name>
,除非不会获取新的引用。update
:在存储库中获取由remotes定义的远程或远程组的更新。<group>
。如果在命令行上既没有指定group,也没有指定remote,则使用配置参数remots .default
;如果没有定义remotes.default
,则所有没有配置参数remote.<name>
。skipDefaultUpdate设
置为true将被更新。