2012-04-26 74 views
3

我已經合併了一個開發分支(與常量,有時不穩定的變化)到我們的主分支(我們存儲發佈,穩定的代碼)。我想將master分支恢復到之前的狀態,比如與dev分支的合併從未發生過(並且在將來我們合併開發分支時,我們現在將放棄的所有更改將再次合併)。還原推送分支到具體提交

這是主分支的當前狀態,我希望它在HEAD處具有'professional-1.1.2'提交/標記。

status of the master branch

我想:

$ git revert -n professional-1.1.2..HEAD 
fatal: Commit 9167e846a387c793edbc089c7ab6bd9eb8260456 is a merge but no -m option was given. 
$ git revert -n -m 1 professional-1.1.2..HEAD 
fatal: Mainline was specified but commit 380169097f35d07466640bc0db1b639278cd25fa is not a merge. 
$ git revert -n -m 2 professional-1.1.2..HEAD 
fatal: Mainline was specified but commit 380169097f35d07466640bc0db1b639278cd25fa is not a merge. 

了一些研究之後,我認爲,更好的選擇是做一個git reset --hard professional-1.1.2git push --force的答案Git: How to ignore fast forward and revert origin [branch] to earlier commit?reverting push'd git commit。其他開發人員在同一個辦公室,他們不應該承諾任何東西來掌握(因爲我不應該,但是...是的,我們沒有每個分支的權限),所以這不是一個大問題告訴他們,做任何事情需要採取的行動。

所以最終的問題是:git revert somethinggit reset --hard <TAG> & & git push --force?如果git revert,我應該使用哪個命令行?

+1

在http://stackoverflow.com/questions/3556501/git-how由Jefromi給出的答案合併後重置可能對您有所幫助。 – vpatil 2012-04-26 09:58:33

+0

@vpatil在我的情況下,最好使用'git reset --hard'而不是'git revert'? – 2012-04-26 10:08:20

+1

是的,我認爲是因爲revert創建一個新的提交,取消上次提交。我肯定會建議使用重置。 – vpatil 2012-04-26 10:39:46

回答

6

-m number選項指定您想要恢復到哪個父母(因爲合併有多個父母)。

所以,你要git revert -m 1 HEADgit revert -m 1 SHA_OF_MERGE_COMMIT(假設你沒有git checkout master; git merge devel;

+0

但我不想僅恢復合併提交,而是恢復合併提交的所有提交。順便說一句,我是'git checkout master; git pull origin develop'。 – 2012-04-26 10:07:19

+2

@CarlosCampderrós你認爲合併提交是什麼?是的,這將恢復合併,這意味着:它將刪除您合併到您的分支中的所有更改。 – 2012-04-26 10:38:16

+0

好吧,我只是恢復語法錯了(所以它不起作用,當我第一次嘗試(如你可以看到問題)),我選擇了錯誤的父母,當我用你的答案。現在...如果在2個月內我再次合併開發分支,我正在恢復的所有提交將會合並?或者只會合併自我現在恢復合併以來的更改? – 2012-04-26 10:49:19

6

如果你只想做的master狀態完全一樣professional-1.1.2,同時避免重寫歷史和力量推,你可以創建一個代表與項目的狀態相同的新提交,代碼爲professional-1.1.2。你可以做下面的步驟:

# Check that "git status" is clean, since the steps that follow will throw 
# way uncommitted changes: 
git status 

# Set the index (staging area) to be as it was at professional-1.1.2: 
git read-tree professional-1.1.2 

# Create a commit based on that index: 
git commit -m "Reverting to the state at professional-1.1.2" 

# Your working tree will still be as it was when you started, so 
# you'll want to reset that to the new commit: 
git reset --hard 

作爲替代方案,您可以按照this answer by Charles Bailey建議的步驟,完成同樣的事情,但稍微混亂,我覺得(即使步驟我已經建議涉及「管道」命令git read-tree)。

+0

使用這個(以專業1.1.2的狀態進行新的提交併推送它),這將允許未來合併開發分支再次帶來現在我正在「恢復」的更改嗎? – 2012-04-26 10:13:00

+0

如果我建議介紹的提交以對象名稱「f414f31」結束,我認爲你可以通過在git merge dev之前執行'git revert f414f31'來進行未來的合併工作。 (我認爲原理與[reverting-a-reverted-merge](http://schacon.github.com/git/howto/revert-a-faulty-merge.txt)相同)。 – 2012-04-26 12:52:46

+0

閱讀http://code.google.com/p/git-core/source/browse/Documentation/howto/revert-a-faulty-merge.txt我認爲你是對的@MarkLongair。這更復雜且容易出錯(因爲在執行'git merge dev'之前,我們忘記了恢復回覆。由於回購是私人的並且環境受到控制,我想我會使用'git reset - 硬和'git push --force' – 2012-04-26 13:01:07

2

如果您是冒失鬼(從上游底墊可以回收所有其他提交者是必要的)

git checkout yourbranch 
git reset HEAD <commit-hash> 
git push origin yourbranch -f