2011-12-20 66 views
5

我的git倉庫有2個分支:master和develop。我想要一個腳本,可以自動將開發的所有更改合併到主文件中。腳本自動合併2個git分支?

我用詹金斯:Git的插件克隆庫,然後這個腳本(的「版本」變量是一個工作參數)運行:

# merge 
git checkout -b develop origin/develop 
git checkout master 
git merge -Xtheirs --squash develop -m "v${version}" 

# commit 
git commit -m "v${version}" 

# tag 
git tag v${version} -m "v${version}" 

# push 
git push origin v${version} 

我試圖在一個測試版本庫,它失敗:

GIT中合併-Xtheirs開發
衝突(刪除/修改):刪除的test.txt在開發和HEAD修改。 test.txt的HEAD版本留在樹中。
自動合併失敗;修復衝突,然後提交結果。

如何解決這個矛盾自動我希望腳本根據「開發」分支總是添加/修改/刪除文件,因爲主人從來沒有碰過...

+3

你說「主人是從來不碰」,但你得到一個衝突呢?如果它實際上從未觸及過,那麼一個簡單的'git merge -ff-only origin/develop'就足夠了。 – fge 2011-12-20 09:19:53

+1

如果您想使用'origin/develop'版本替換主版本,而不是記錄合併提交,爲什麼還要使用'merge --nosquash'? git checkout master && git reset origin/develop && git reset --soft HEAD @ {1}'或類似的東西會不會更清潔? – 2011-12-20 09:24:15

回答

5

合併策略-X theirs只適用於解決文件中的衝突hunk。這些選項的文檔是the git-merge man page

 ours 
      This option forces conflicting hunks to be auto-resolved 
      cleanly by favoring our version. Changes from the other tree 
      that do not conflict with our side are reflected to the merge 
      result. 

      This should not be confused with the ours merge strategy, which 
      does not even look at what the other tree contains at all. It 
      discards everything the other tree did, declaring our history 
      contains all that happened in it. 

     theirs 
      This is opposite of ours. 

在這種情況下,一個支路刪除了,而另一個已經修改它的文件,它是由兩個分支之間的簡單衝突的大塊,都使得不同的獨特情況下修改。

+0

有沒有辦法讓Git自動選擇「刪除文件」,如果任何一個已經刪除它? – 2014-07-21 04:16:20

1

5歲....但仍然有關。

這裏是我的解決方案: 我刪除主分支,並創建分支新的主分支我想從對「合併」:

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'` 
GIT_BRANCH_TO_MERGE_TO="master" 

git checkout "${GIT_BRANCH_TO_MERGE_TO}" 
git checkout "${GIT_BRANCH_TO_MERGE_FROM}" 

# Delete TO branch 
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin" 

# Create TO branch 
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}" 
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin"