Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git pull是否影响远程跟踪分支?_Git_Git Merge_Git Pull - Fatal编程技术网

git pull是否影响远程跟踪分支?

git pull是否影响远程跟踪分支?,git,git-merge,git-pull,Git,Git Merge,Git Pull,我们知道git pull=git fetch+git merge。但我对git merge的理解是,它只影响要合并到的分支,而不是要合并的分支 所以在git pull的情况下,我想它看起来是这样的: git fetch origin git merge origin/master 如果是这种情况,源站的新更改将在主站上重播,但源站/主站不会将更改提交给本地主分支。git pull是否确保远程跟踪分支(origin/master)包含git合并后在master中所做的所有新更改,还是在执行git

我们知道git pull=git fetch+git merge。但我对git merge的理解是,它只影响要合并到的分支,而不是要合并的分支

所以在git pull的情况下,我想它看起来是这样的:

git fetch origin
git merge origin/master

如果是这种情况,源站的新更改将在主站上重播,但源站/主站不会将更改提交给本地主分支。git pull是否确保远程跟踪分支(origin/master)包含git合并后在master中所做的所有新更改,还是在执行git push时所做的更改?

简单的回答是:不,远程跟踪分支不受影响

考虑像
origin/master
这样的远程跟踪分支的一个好方法是,您的git几乎总是与他们(origin的)git保持独立,除非您告诉您的git调用他们的git和坐标。通过互联网电话呼叫遥控器的命令有
git-fetch
git-push
(当然还有初始的
git-clone
)。因此,
origin/master
在上次git与之同步时总是“where
master
在origin上”

当您获取或推送时,您的git会获得git对其所有分支的了解,并更新远程跟踪分支。它将它们设置为远程设备当时拥有的任何东西,前提是您也拥有这些SHA-1 ID。1您可以限制git更新的分支,但是直接获取git的默认方法是获取远程设备的所有当前信息

还有另外一条命令2可以打电话给遥控器,但不会更新git的远程跟踪分支:
git ls remote
执行获取或推送的第一步,然后只显示从遥控器获取的所有引用名称。试试看,这是纯粹的信息,但会让你看到这到底是如何工作的


1您的git无法将您自己的远程跟踪分支指向您没有的SHA-1。由于
git fetch
通常会带来所有东西,因此它是进行主要更新的一个。使用
git push
您要求远程设备将其SHA-1 ID更改为git发送的内容,因此如果它说“是”,那么根据定义,您也有这些对象,但这仅保证您发送的分支和/或标记,而不是其他分支


2实际上有好几种,但只有一种可以用来举例说明。为了完整起见,我要提到的是,
git remote show
有时也会给远程设备打电话。

如果您将分支B合并到分支A,您需要将更改推送到分支A的远程分支,以便更改显示在那里。对不起,我不是这个意思。我想知道当您执行git fetch+git merge时,远程跟踪分支是否使用本地更改进行更新。如果您有本地更改,您可以执行
git stash
存储更改,然后
git pull
从远程分支获取更改,然后
git stash pop
重新应用更改。执行
git pull
不会自动将本地更改应用于远程分支。你必须自己把它们推上去。@JackmeriusTacktheritrix谢谢你的回答-对不起,你的回答不是我要问的。顺便说一句,更准确的说法是,原点/母版上的更改将合并到母版中,而不是在母版上“重放”。另一方面,如果您将fetch设置为使用rebase而不是merge,那么您的更改将被重放(更准确地说,是复制了一个la
git cherry pick
),但是在fetch步骤之后会被复制到新的基本提交上,就像在new
origin/master
上找到的那样。因此我认为在git push之后,如果您再次执行git fetch,远程跟踪分支现在将包含本地?中的新更改。如果
git push
成功,则远程跟踪分支将已经匹配您推送的任何内容(因为远程跟踪分支同意将其分支设置为您推送的ID)。例如,如果您说
git push origin 1234567:master
,并且您有一个ID为
1234567
的提交,并且
push
成功,那么您的
origin/master
现在将包含
1234567
。如果您想确定,您可以再次检查
git fetch origin
,或者使用
git ls remote origin
查看它。只是为了确保-所以您的答案是,如果我在本地分支中有新的更改,并且服务器有新的更改,那么在git fetch和git merge之后,我的本地分支将与我的跟踪分支(原始/主分支)不同,对吗?你说得对。您尚未将本地更改推送到远程分支,因此它们在这方面会有所不同。@Boon:是的。现在的情况是git喜欢保存几乎所有的内容,因此它拥有您的所有提交,并且
fetch
添加所有提交。如果您随后进行新的合并提交,则只有您有新的合并提交(并且只有您有以前的合并提交),但您确实得到了它们的提交,并且您的
源代码/master
(仍然)会告诉您“上次检查时它们在哪里”。一旦你推送,你给他们你的提交,并要求他们设置他们的主指向你最近的提交(你刚刚给他们)。如果他们说“好”,你的git知道他们现在拥有你给他们的东西。