git add 如何撤回?git commit 如何撤回?git push 如何撤回?

修改commit(撤回git add 和git commit)

这部分仅适合没有git push 提交的,若是已经提交的,则仅能使用上面的命令才行

修改最新commit

1
2
3
git reset HEAD~1 # 相当于git reset --mixed HEAD~1 会撤销add和commit
# 正常修改代码
# 再次add和commit即可

修改上一次commit

1
2
3
git reset HEAD~2
# 正常修改代码
# 再次add和commit即可

完全撤回commit(就是撤回git push ,直接在远程和本地的git log里看不到这条commit记录)

注:带–hard的会删除本地更改的代码

方案1

1
2
3
4
git log # 查看commit 历史
git reset --hard HEAD^ # 回滚到上次提交
git reset --hard xxxxx # 回滚到xxxxx提交
git push origin master -f # 提交删除操作

方案2

1
2
3
4
git log # 查看commit 历史
git rebase -i xxxxxx # xxxxx为目标commit的前一个commit
然后drop掉目标commit
git push origin master -f # 提交删除操作

初次提交

1
2
3
4
修改文件
git add . # 添加修改
git commit --amend -m 'initial commit' # 提交修改(但其实是修改的上一次提交)
git push origin main -f # 上传修改

在第一次提交之前没有任何东西,因为每次提交都引用一个父提交。这使得第一次提交是特殊的(孤立提交),所以没有办法引用以前的“状态”。
因此,如果您想修复提交,您可以简单地git commit –amend:这将修改提交,而不创建另一个提交。
如果只是想重新开始,可以删除.git存储库,然后使用git init创建另一个存储库
refs:https://cloud.tencent.com/developer/ask/sof/77445
refs:https://blog.csdn.net/CHAOS_ORDER/article/details/122655480

git选项

git reset

1
2
3
4
5
6
7
8
git reset --soft 	完全保留工作区和暂存区,会撤销git commit提交,保留git add操作的内容(所有reset都会执行这个操作)

git reset --mixed 完全保留工作区,会撤销commit提交和git add操作 (默认选项)

git reset --hard 彻底清除工作区和暂存区,***慎用***

git reset --keep 保留工作区和HEAD之间的差异

HEAD~N or HEAD^N

替代commit id,表示距离HEAD之前的第N次commit id
另附:很好的一张解释图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
G   H   I   J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A

A = = A^0
B = A^ = A^1 = A~1
C = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2

ref:https://stackoverflow.com/questions/2221658/whats-the-difference-between-head-and-head-in-git