获取拉取请求的最佳方法是移动到git中的另一个分支

时间:2013-11-27 18:16:58

标签: git github merge

我有两个分支masterdev,而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-DFH-Imaster移到dev

基本上,如果我在masterdev之间进行差异,我需要从master中移除dev以外的所有内容,并将其从master移除{1}}。

我知道这有点乱,主要是因为我们在流中改变了流程。说实话,我正试图弄清楚它是如何在这种状态下开始的。我甚至不确定dev分支master

所以我只是想在这一点上找到清理混乱的最佳方法,并且继续前进,这不应该是一个问题(现在我们已经“修复”了我们的过程)。

我查看了cherry-pickmergerebase,但我不确定这里哪个合适。我原来正在考虑cherry-pick,但由于master应该是dev的一个子集,我想知道mergerebase是否更合适。< / p>

另外,仅供参考,没有人直接从这两个分支机构工作,并且正在使用他们自己的分支,如果这对解决方案产生影响。

更新

所以我做了git log masterdev

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是底部标记的行。

换句话说,唯一做的就是将三个拉取请求(dev8b6e9857ef0317)合并到7bf0c25而不是master }。

我认为GitHub上的视图让我感到困惑,因为作为拉动请求的一部分提交的提交是在早期(按时间顺序)进行的,但是直到合并结束时它们才会被提交。

那么我需要做些什么才能将这三个拉取请求移到dev?我知道如何在这些提交之前移回dev主服务器,只是不确定将这些合并提取请求转移到HEAD的最佳方法。

2 个答案:

答案 0 :(得分:1)

好的,我对github一无所知,但要在你自己的本地回购中做到这一点:

首先,让我们确保在pull-request提交上有标记 - 分支或标记名称,这些是在图形的“右侧”进入的合并提交“之前” - 日志输出。其中有三个(数字169,170和168略有奇怪的顺序)。他们提交了8b6e985(#168),7bf0c25(#170)和7ef0317(#169)。

碰巧,它们都有很好的标记,origin/pr/168origin/pr/170origin/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中“删除”了三个合并提交,方法是在图表中将标签指向三个节点。名称HEADmaster无法再访问这三个合并提交。它们仍然可以通过名称origin/masterorigin/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

然后使用cherry-pick有选择地合并来自master

的提交

git cherry-pick d132fc724a7f749168a95383a3b376b1c4f699ef