为什么是;git pull原点功能-12345 master“;更新我的请求分支的唯一方法是什么?
我正在处理BitBucket上的一个pull请求,该请求已经打开了相当长的时间(几个星期,master继续快速进行),我不是唯一一个提交PR的人。我还需要使PR与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
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
文件中提取