2016-04-27 177 views
0

我在git中有一個分支和合並的問題。 我們有以下分支機構(這是我們的產品,並保持在parallell因爲它們都被安裝在客戶支持)git合併分支 - 不想在遠程分支基地之前提交

2015Edition1 
2015Edition2 
2016Edition1 
2016Edition2 
master 

我們可以認爲這些分支機構發行的分支。 問題如下。 2015Edition1被分支,並且修復被提交到分支fix1

2015Edition1 
     fix1\-- bugfix 

該修復程序合併回2015Edition1併發布。

2015Edition1--------------merge 
     fix1\-- bugfix --/ 

然而,分行2015Edition22016Edition12016Edition2不同相當嚴重,由於二進制幫助文件,很多產品依賴圖片等,並在源代碼的變化是永遠不會合並回主。

有什麼辦法合併fix1分支,只獲得了提交的fix1

我要的是如下的結果:

2015Edition1--------------merge-- 
     fix1\-- bugfix --/ 
         \ 
       ----------merge-- 
2016Edition2fix/ 
    2016Edition2 -- 

我知道我可以櫻桃挑提交到其他分支機構。但這是一個非常簡單的例子。我認爲我失去了跟蹤各個分支的能力。

任何意見和建議

+0

簡答:沒有。你可以用'--no-commit'進行合併,清除所有的合併結果,用cherry-pick(使用'git cherry-pick -n')替換它們,並提交;但這是一個不好的策略,最終會導致流淚。 – torek

+0

是的,這就是爲什麼我想避免這種情況。 我想也許git merge-base 2015Edition1 2016Edition2Edition可以從分支開始不同的地方給出點。但我不確定源代碼是否存在於這一點上。 (因此很難修復:) –

回答

0

您可以按照下列步驟操作:

  • git status
  • git add(如果你可以修改或添加任何文件)
  • git commit -m "<message>"
  • git push origin <your branch>
  • git checkout <main branch>
  • git pull origin <main branch>
  • git merge <your branch>
  • git push origin <main branch>

這是承諾和Git的合併以正確的方式。請不要使用 git add .,而是可以使用git add <file path>

+0

我相信OP正在尋找如何維護長期運營的分支機構的技巧,而不僅僅是如何與分支機構合作。 – alextercete

+0

我只說明要用適當的git步驟來提交代碼。 –

1

我覺得這裏的問題是,你要維持多長時間運行的分支,這不是Git的設計的工作方式。

說你有三個分支,release1release2release3

* 3d3 (release3) 
* 28d 
* e38 
* b51 
| * 27a (release2) 
| * df1 
| | * 948 (release1) 
| | * ce3 
| |/ 
|/| 
| | 
|/ 
* 166 (master) 
* 6f0 
* 1e8 

如果添加了新的承諾release1,你想帶的是爲release2,你最終會帶來ce3948沿用它。

這很容易混亂,你最終會失去已被合併到什麼的軌道。由於代碼差別很大,也許你應該考慮將分支移動到它們自己的獨立存儲庫中,並將代碼的公共區域提取到可分發的庫/包中(它應該也可以放入它自己的存儲庫中)。

0

在合併到主分支之前,可以使用以下腳本壓扁功能分支提交。

# brief: This script should be run from within your git repo. You need to have your feature branch 
# checked out. This will squash all the commits on your feature branch (assuming you 
# branched from master). Then you can just use the github PR UI to merge the PR in. You need to have 
# feature branch checked out when you run this script (git checkout feature branch). 

# usage: git-helper-squash-all-commits <final commit messsage ex: "reorganizing directory structure" 
# example: git-helper-squash-all-commits "reorganizing directory structure" 

#!/bin/sh 
set -ex 
FINAL_COMMIT_MESSAGE=$1 
BRANCH_YOU_BRANCHED_FROM=master 
CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` 
COMMIT_HASH=`git merge-base HEAD $BRANCH_YOU_BRANCHED_FROM` 
git reset --soft $COMMIT_HASH 
git commit -am "$FINAL_COMMIT_MESSAGE" 
git push origin $CURRENT_BRANCH --force 
0

好吧,我通過重新排列錯誤修正解決了這個問題。我從一開始就做錯了。 爲我工作的結果是找到分支之間的合併基礎提交,在合併基礎中創建一個分支。然後櫻桃挑選bugfix提交到該分支(我認爲我可以在新分支上完成rebase),然後將新分支合併到其他應包含bug修復的分支中:

$git merge-base 2015Edition1 2016Edition2 (earliest vs latest release) 
5a5def 
$git checkout -b bugfix-branch 5a5def 
$git cherry-pick -x bug-fix-commit 
$git checkout 2016Edition1 
$git merge bug-fix-branch 
$git checkout 2015Edition2 
$git merge bug-fix-branch 
.... and so on. 

這似乎是解決問題的方法。我的錯誤是我沒有從正確的提交中分支出來。 對此有何評論?這是以「正確」的方式解決問題的方法嗎?