2011-09-17 77 views
14

我剛纔做了一個如何撤消git merge squash?

git merge --squash feature-branch 

到我develop分支。

問題是,上述命令更新了頭部而未創建新的提交。我的意圖是創建一個單一的承諾,適用於develop的負責人。

所以簡而言之,合併前後develop分支的日誌完全一樣。

有沒有辦法將develop恢復到git merge之前的狀態?

謝謝。

解決方案

基於從丹D.註釋及以下我接受的答案是能解決我的問題。請參閱下面的內容如果您在同一條船上,我所做的事情如下:

1 - 我跑了git reflog,它列出了我用我的develop分支所做的所有提交和檢出。

2 - 我沒有按照建議去做git reset [email protected]{1},而是在做最後一次開發的時候找到了我想保留的數字。在我的情況下,它是[email protected]{188}。所以我輸入git reset [email protected]{188}

3 - 我運行了一個git log,它有一個乾淨的日誌,只顯示我在進行錯誤合併之前提交的提交。

4 - 我運行git add -A .來分階段列出在我的功能開發期間創建的所有新文件。

5 - 我跑git commit -m "install feature-x"

6 - 結果現在我有分支develop用正確的文件和日誌是乾淨的 - 只顯示一次提交的所有更改的feature-x發展過程中我做到了。

我仍然需要找出爲什麼我的原始git merge --squash feature-branch沒有按預期工作。

解決方案2

馬克Longair的答案是明確的解決我的問題。我剛剛測試過它,它工作。見我現在使用的壁球一個feature-branch內的所有內部提交和僅包含一個提交到develop分支的過程如下:

git checkout develop 
git merge --squash feature-branch 
git commit -m "install of feature-branch" 

上述序列的工作就像一個魅力。

+2

使用'git reflog'。 –

回答

17

如果您運行git merge --squash <other-branch>,則工作樹和索引將更新爲合併結果,但不創建提交。所有你需要做的就是運行:

git commit 

但是,如果你在提交之前改變了主意,只是想中止合併,你可以簡單地運行:

git reset --merge 

你不需要使用reflog。

+0

Uau,謝謝。我正在一個新的功能分支中工作,我會測試你的建議,看看它是否有效。我會用結果更新這個問題。謝謝。 – jdias

+0

經過測試,它的工作原理。謝謝馬克。我剛剛用你的答案更新了我的問題。 – jdias

+0

+1另一個想法被解決了。謝謝! (在一個稍微沮喪的說明:這是因爲在git中,所有子命令的行爲有點不一致 - 合併,隱藏應用,結帳與本地更改,所有行爲都不同,更不用說過多的'git checkout HEAD --'與'git checkout HEAD - .','git rebase --abort',但不是'git merge --abort','git push --all',但不是'git pull --all'和許多細微的例子:)) – sehe

0

如果你在提交之前改變了主意,你有這些選項:

中止與現代的git語法合併:

git merge --abort 

,並與舊的語法:

git reset --merge 

而且真的老學校:

git reset --hard 

但實際上,值得注意的是,git merge --abort僅等價於git reset --merge,因爲存在MERGE_HEAD。這可以在合併命令的git幫助中讀取。

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

失敗的合併後,當沒有MERGE_HEAD,失敗的合併可以用git reset --merge撤銷,但不與git merge --abort必然,所以他們不僅是新老語法同樣的事情。我個人認爲git reset --merge在日常工作中更有用。