为什么是;git pull原点功能-12345 master“;更新我的请求分支的唯一方法是什么?

为什么是;git pull原点功能-12345 master“;更新我的请求分支的唯一方法是什么?,git,merge,version-control,Git,Merge,Version Control,我正在处理BitBucket上的一个pull请求,该请求已经打开了相当长的时间(几个星期,master继续快速进行),我不是唯一一个提交PR的人。我还需要使PR与master保持同步。因为有多个人在分支上工作(而且感觉很脏),所以做一个重基然后git push--force不是一个好的选择 在这种情况下,我发现唯一有效的方法是: git checkout master git pull origin master git checkout -b feature-12345 origin/feat

我正在处理BitBucket上的一个pull请求,该请求已经打开了相当长的时间(几个星期,master继续快速进行),我不是唯一一个提交PR的人。我还需要使PR与master保持同步。因为有多个人在分支上工作(而且感觉很脏),所以做一个重基然后
git push--force
不是一个好的选择

在这种情况下,我发现唯一有效的方法是:

git checkout master
git pull origin master
git checkout -b feature-12345 origin/feature-12345
git pull origin feature-12345 master
git push origin feature-12345
上面的关键行是
git pull origin feature-12345 master
,这将导致提交消息:

Merge branches 'feature-12345' and 'master' of ssh://mybitbucketserver/ABC/xyz into feature-12345
完成此操作后,BitBucket会在PR的“提交”列表中显示一个很好的“合并”提交,而不是用来自master的最近提交来填充提交历史

我很高兴我已经解决了如何做到这一点,但我的问题是:为什么我需要使用那个特定的命令,使它以这种方式合并?如果我尝试(在
feature-12345
分支上):

然后推,它淹没了我的提交历史

如果我这样做的话也是一样(我认为这将100%等同于git pull origin feature-12345 master的合并部分,但似乎不是这样):


git pull origin feature-12345 master有什么特别之处?

git pull
只不过是一个
获取
,然后是一个
合并

git pull feature-12345 master
更新您的远程分支
origin/feature-12345
origin/master
,然后将这两个分支合并到您当前的
头中

我不知道为什么
git-pull-origin-master
会让bitbucket显示master的整个历史,我猜它会被合并分支作为远程分支(
origin/master
,而不仅仅是
master
)弄糊涂,或者可能是因为您合并了两个分支(
origin/master
origin/feature-12345
)转换为第三个(
feature-12345

我建议您首先更新master,在本地合并到您的分支,然后推送生成的分支:

git checkout master
git pull origin master # keep your master branch up to date
git checkout feature-12345
git merge master # to get new features from master, resolve conflicts...
git push origin feature-12345 # push the merge commit to bitbucket

git pull
不过是一个
fetch
,然后是一个
merge

git pull feature-12345 master
更新您的远程分支
origin/feature-12345
origin/master
,然后将这两个分支合并到您当前的
头中

我不知道为什么
git-pull-origin-master
会让bitbucket显示master的整个历史,我猜它会被合并分支作为远程分支(
origin/master
,而不仅仅是
master
)弄糊涂,或者可能是因为您合并了两个分支(
origin/master
origin/feature-12345
)转换为第三个(
feature-12345

我建议您首先更新master,在本地合并到您的分支,然后推送生成的分支:

git checkout master
git pull origin master # keep your master branch up to date
git checkout feature-12345
git merge master # to get new features from master, resolve conflicts...
git push origin feature-12345 # push the merge commit to bitbucket

你想要的是:

git fetch origin
(可选)后跟:

git checkout master
git merge origin/master   # *do* allow fast-forward here
git checkout feature-12345
git merge origin/feature-12345   # or git rebase origin/feature-12345
git merge --no-ff origin/master  # or git merge --no-ff master
其次是:

git checkout master
git merge origin/master   # *do* allow fast-forward here
git checkout feature-12345
git merge origin/feature-12345   # or git rebase origin/feature-12345
git merge --no-ff origin/master  # or git merge --no-ff master
如果需要/需要,然后是:

git checkout master
git merge origin/master   # *do* allow fast-forward here
git checkout feature-12345
git merge origin/feature-12345   # or git rebase origin/feature-12345
git merge --no-ff origin/master  # or git merge --no-ff master
尽管如此,您可能需要重新考虑从master的tip commit合并到feature分支的策略。这并不是真的错误,但随后将feature分支合并回master分支可能会导致交叉合并,Git确实可以处理这种情况,但可能会带来惊喜

说明(长) 正如,
git-pull
只需先运行
git-fetch
,然后一旦成功-
git-merge
(如果您告诉它,有时还可以运行另一个git命令)

棘手的部分是如何
git pull
运行
git merge
。它并没有达到大多数人最初期望的效果

Git的
merge
谓词合并提交。
Git merge
的参数指定将哪些提交用作“他们的”提交。您的提交,即正常三方合并中的
--ours
提交,总是
HEAD
:当您第一次运行命令时,任何提交都是当前的。
git pull
运行其两个git命令的方式,当您运行
git pull
时,当前的提交在
git pull
运行时仍然是当前的

普通三方合并的合并基数非常简单;
git merge base
将为您计算它。但您并不是在进行普通的三方合并。相反,您是在进行git称为八达通合并的操作。为了找到此操作的合并基数,git使用
git merge base--octopus
,为其提供
HEAD
commit和要合并的每个目标提交的哈希ID。Git然后将此合并基与要合并的每个提交进行比较,并合并所有更改


运行时:

git pull origin feature-12345 master
git merge <single-commit-specifier>
您告诉您的Git连接到
origin
上的第二个Git,并通过运行
Git pull
请求它的
功能-12345
主控

git fetch origin feature-12345 master
这些名称解析为两个提交哈希ID(可能不同,但可能只有一个)。如果您的Git还没有这些提交,您的Git将立即下载这些提交。如果您的Git已经有这些提交,您的Git不需要在此处执行任何操作

下一步取决于您的Git版本。如果您的Git是1.8.4或更高版本,您的Git会立即“机会主义地更新”您的
origin/feature-12345
origin/master
。否则,它将保持不变

最后,您的
git fetch
将这些原始提交哈希ID转储到文件
.git/fetch\u HEAD
中。
git fetch
步骤现在完成

pull
代码现在移动到第二个Git命令:它运行
Git merge
,其中两个散列ID从
.Git/FETCH\u HEAD
文件中提取