題 如何回滾1次提交?


我有2個提交,我沒有推:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

我怎樣才能回滾我的第一個(最老的一個),但保留第二個?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

從這裡:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

我只需要這樣做:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

那是?


119
2017-09-03 21:23


起源


這個問題似乎是偏離主題的,因為它是關於編程工具的。它屬於Stack Overflow。 - Peter Mortensen
@PeterMortensen同意。這是SuperUser的範圍 - Kolob Canyon


答案:


最安全,也可能是最乾淨的方法是以交互方式進行改造。

git rebase -i HEAD^^

要么,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

從那裡你可以壓縮提交,將一個或多個提交放在前一個提交中。要從歷史記錄中完全刪除提交,請從列表中刪除該行。

您可以使用還原提交 git revert 但它會在歷史記錄中添加更多提交消息,這可能是不可取的。使用 -n 告訴Git不立即提交恢復的參數。您可以以交互方式進行折扣,並將這些內容壓縮到之前的承諾中以保持清潔。

如果您在這裡使用的兩個提交影響相同的文件,您可能會看到合併衝突。

使用重置存儲庫 git reset --hard 應該小心,因為它無法撤消。

重寫歷史應該小心。


92
2017-09-03 21:32



如何在'git rebase'中刪除提交?只有3個命令:pick,edit,squash。沒有刪除AFAIK。 - n179911
完全從列表中刪除該行,並刪除該提交 - jtimberman
當我想要恢復變化時,我想不遺餘力。如果您還想留下您的還原痕跡,這是最好的方法。 - Phillip Whelan
“最安全,也許最乾淨的方法是交互式地改變”如果你不使用vim,也許不是。我很幸運,想出了我的方法。仍然支持因為我應該學習vim :-) - isimmons
我建議使用 rebase 盡量少。如果你與他人合作,那麼就做 revert。 - boldnik


這個如果來自 http://nakkaya.com/2009/09/24/git-delete-last-commit/  它對我有用

Git刪除最後提交

有一段時間深夜,當我用完咖啡時,我會投入一些東西   我不應該。然後我花了接下來的10-15分鐘谷歌搜索   如何刪除我做的最後一次提交。所以在第三次之後我想   記錄下來,以便稍後再提及。

如果你犯了垃圾而沒有推,

git reset --hard HEAD~1

HEAD~1是head之前提交的簡寫。或者你   可以引用要重置的哈希的SHA-1。注意   當使用--hard對工作樹中跟踪文件的任何更改時   因為在頭之前的提交丟失了。

如果您不想消除已完成的工作,可以使用    --soft 將刪除提交的選項,但它將留下您的所有   已更改文件“要提交的更改”,因為git status會將其設置為。

現在,如果你已經推了一個人拉了,這通常是我的情況,   你不能使用git reset。但是你可以做一個git revert,

git revert HEAD

這將創建一個新的提交,以反轉所引入的所有內容   意外的提交。


48
2017-08-05 17:52



使用--soft選項,它非常適合重命名文件的位置,並且意外地“git commit -a”而不是首先使用“git add”。 - Aaron Harun


不。 git-reset --hard會帶你回到歷史。您正在尋找的是git revert,它將撤消任何提交。


8
2017-09-03 21:26



嗯,這可行,但它也污染你提交日誌。如果這些提交沒有被推/拉,那麼最好用交互式rebase來清理它們。改變歷史記錄的能力是git優於其他版本控制系統的主要優勢之一。 - knweiss


我剛剛這樣做了:

git rebase -i HEAD^^

我搞砸了,所以我做了

git rebase --abort

然後再做一次。然後我不得不這樣推:

git push origin master -f

並且它比我回滾的提交更新了提交。工作得很好。


5
2017-12-12 04:39





關於jtimberman的評論 git reset --hard 可撤銷,這並不完全正確。看這裡: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1


4
2018-01-28 03:48





沒有, git reset --hard baf8d5e 將刪除 3368e1c 提交和HEAD將在 baf8d5e 然後。

如果你想保留 3368e1c提交並刪除 bad8d5e 提交最簡單的解決方案是做一個“git rebase -i HEAD~2“(即最後兩次提交的交互式rebase)。這個命令將啟動你的提交消息編輯器,你會看到最後兩次提交的每一行都有一行。你只需要刪除 bad8d5e 提交行並保存。然後git會重寫你的歷史記錄,第二次提交就會消失。

您可以在提交消息編輯器中使用其他有用的命令 squashedit交互式rebase是非常強大的!

如果有人已經看到這些提交(從您的存儲庫推送或拉出),請不要這樣做!


3
2017-09-03 21:46





git checkout <treeish> -- /path/to/dir

這將從/ path /到/ dir的給定“treeish”中恢復目錄


2
2017-10-12 09:23





git reset --hard {ref}

如果repo中只有一個其他提交(例如,初始提交和另外1個提交),則是撤消提交的唯一方法。其餘的方式(revert,rebase)拒絕工作,至少從git 1.7.5.1開始。

如果你遵循 git reset 用一個 git gc 那麼git實際上會完全從repo中刪除舊的提交數據。


1
2018-02-28 20:17