我有两个分支master
和dev
,而master
应该是dev
的子集。我对master
进行了一些提交,我需要将其移至dev
。但是,master
中的一些错误提交发生在其他有效提交之间。
所以它目前看起来像这样:
master
A - B - C - D - E - F - G - H - I
dev
A - B - - - - - E - - - G
\
- - - J - K - L
但我需要让它看起来像这样:
master
A - B - - - - - E - - - G
dev
A - B E G
\ / \ / \
C - D F H - I - J - K - L
所以从本质上讲,我需要将C-D
,F
和H-I
从master
移到dev
。
基本上,如果我在master
和dev
之间进行差异,我需要从master
中移除dev
以外的所有内容,并将其从master
移除{1}}。
我知道这有点乱,主要是因为我们在流中改变了流程。说实话,我正试图弄清楚它是如何在这种状态下开始的。我甚至不确定dev
分支master
。
所以我只是想在这一点上找到清理混乱的最佳方法,并且继续前进,这不应该是一个问题(现在我们已经“修复”了我们的过程)。
我查看了cherry-pick
,merge
和rebase
,但我不确定这里哪个合适。我原来正在考虑cherry-pick
,但由于master
应该是dev
的一个子集,我想知道merge
或rebase
是否更合适。< / p>
另外,仅供参考,没有人直接从这两个分支机构工作,并且正在使用他们自己的分支,如果这对解决方案产生影响。
更新:
所以我做了git log
master
和dev
:
git checkout master
git log --graph --oneline --all --abbrev-commit --decorate > ../master.txt
git checkout dev
git log --graph --oneline --all --abbrev-commit --decorate > ../dev.txt
然后对两张图进行了比较。这给了我一个更好的(幸运的是,更清洁)图片,说明了发生的事情:
--->* de80f1b (HEAD, origin/master, origin/HEAD, master) Merge pull request #168 from nebula101/support-lf-newlines
|\
| * 8b6e985 (origin/pr/168) Add support for the LF line ending
* | b966002 Merge pull request #170 from nebula101/fc_alphanumeric
|\ \
| * | 7bf0c25 (origin/pr/170) Add NNID
| * | 060671d Add XBox360 and PSN to fc tool
* | | 8089053 Merge pull request #169 from nebula101/small-changes
|\ \ \
| * | | 7ef0317 (origin/pr/169) Update noticeboard header text
| * | | ebe7d80 Add festive avatars
| * | | 06dc673 Add 'Austria' to the list of countries
| * | | e04d1a5 Fix a small typo
| * | | d08d254 Fix images in view_view.asp
| * | | 761c09c Fix items_list.asp
| * | | 45096b7 Add Halloween avatars
| * | | c05806f Fix age in profiles
| * | | 5afdcbd Fix a typo in noticeboard_responses.asp
| * | | e254a33 Chenge 'CNB edit should alert users' default
| | |/
| |/|
--->| | | * 3e3e829 (origin/dev, dev, AngelWings666-master) Merge pull request #181 from Quintinius/master
| | | * 2165f08 (Quntinius-master) Merge pull request #183 from jeradrose/dev
| | | |\
....
基本上,唯一的区别是标有--->
的行,HEAD
的{{1}}位于第一行,master
位于HEAD
是底部标记的行。
换句话说,唯一做的就是将三个拉取请求(dev
,8b6e985
和7ef0317
)合并到7bf0c25
而不是master
}。
我认为GitHub上的视图让我感到困惑,因为作为拉动请求的一部分提交的提交是在早期(按时间顺序)进行的,但是直到合并结束时它们才会被提交。
那么我需要做些什么才能将这三个拉取请求移到dev
?我知道如何在这些提交之前移回dev
主服务器,只是不确定将这些合并提取请求转移到HEAD
的最佳方法。
答案 0 :(得分:1)
好的,我对github一无所知,但要在你自己的本地回购中做到这一点:
首先,让我们确保在pull-request提交上有标记 - 分支或标记名称,这些是在图形的“右侧”进入的合并提交“之前” - 日志输出。其中有三个(数字169,170和168略有奇怪的顺序)。他们提交了8b6e985
(#168),7bf0c25
(#170)和7ef0317
(#169)。
碰巧,它们都有很好的标记,origin/pr/168
,origin/pr/170
和origin/pr/169
。所以第1步是:检查标签是否存在,它们是否完成。
现在,让我们修复master
,然后强制将结果推回origin
(这假设没有其他人选择了这些,或者如果他们有,他们知道如何从力量中恢复-push):
git status # make sure everything is clean
git show master~3 # make sure this is the right commit
假设这些看起来正确,让我们继续master
并告诉git将其重置(使用--hard
)到master~3
,即备份三个左侧的父提交:
git checkout master
git reset --hard master~3
我们现在已经从分支master
中“删除”了三个合并提交,方法是在图表中将标签指向三个节点。名称HEAD
或master
无法再访问这三个合并提交。它们仍然可以通过名称origin/master
和origin/HEAD
访问,但我们即将改变它:
git push -f origin master # anyone else using this is out of luck
假设origin
允许这种强制推送,它现在还有三个合并提交不可访问(并且很可能会快速垃圾收集它们)。这也至少改变了我们origin/master
的副本,也可能origin/HEAD
,所以现在我们看不到合并(虽然它们仍在那里,并且由于reflog会停留约90天条目)。
除此之外:如果不起作用怎么办?如果远程仓库禁止强制推送,则必须“恢复合并”。这可以用git revert
完成,这只是有点烦人,因为它后来重新合并更加困难。让我们离开这个答案吧。 : - )
最后,您希望进行 new 合并,以将这些提交链带入dev
。所以进入分支dev
:
git checkout dev
然后执行合并。可以使用一些更自动的方法来处理pull请求和github,但这样做可以解决问题:
git merge origin/pr/169 # bring in pull request 169's chain of commits
# do any fixing-up required, here - usually the merge will just work
# automatically and make a commit for you
git merge origin/pr/170 # bring in #170's single commit
# and fix-up if needed here, too
git merge origin/pr/168 # bring in #168's single commit
# and again here
事实上,如果您愿意,可以使用“章鱼合并”一次合并所有三个。您可以使用一个:
,而不是三个单独的合并命令git merge origin/pr/169 origin/pr/170 origin/pr/168
在git-merge documentation中描述了八达通合并(尽管不是很好)。
答案 1 :(得分:0)
master
分支: git checkout master
git log
现在,您将看到列出的提交以及每次提交的哈希:
commit a0b6aa63955aa4dc9a2154e0a0de3b2e8ee6bef2作者:Kevin Bowersox 日期:星期一11月25日09:51:14 2013 -0500
Commit to update
commit d132fc724a7f749168a95383a3b376b1c4f699ef作者:Kevin Bowersox 日期:星期一11月25日09:34:40 2013 -0500
removed interceptor
dev
:。例如,第二个提交哈希是:d132fc724a7f749168a95383a3b376b1c4f699ef
dev
分支: git checkout dev
git cherry-pick d132fc724a7f749168a95383a3b376b1c4f699ef