问题:
使用git时,有个非常常见的问题。commit修改之后,如果发现修改不完整或者有错误,想继续修改,该怎么做呢?
我知道可以创建新的commit,可是我有commit洁癖,一个commit想包含完整和正确的修改。
分析和解决步骤(git reset解决,详细分析步骤参考):
#已创建first commit - 1/2(HASH值为ca3c51a)。现在使用git log命令观察commit日志,HEAD指针现在指向first commit - 1/2(HASH值为ca3c51a)。
liyane@Yans-MacBook-Air gittoken % git log
commit ca3c51a90490b532871f48519a35f9dd3c5dae8b (HEAD -> main)first commit - 1/2
commit ca8bcbc51b2892e672013a66efae03c3662e6e10 (origin/main)
...
#步骤1. 使用git reset回退。HEAD指针回退到上一个commit HEAD~。--soft 参数将保留修改内容,并设置为待commit状态。liyane@Yans-MacBook-Air gittoken % git reset --soft HEAD~
#git reset之后使用git log命令查看目前的commit日志。比较上一个git log结果,HEAD指针现在回退到上一个commit。
liyane@Yans-MacBook-Air gittoken % git log
commit ca8bcbc51b2892e672013a66efae03c3662e6e10 (HEAD -> main, origin/main)
...
#步骤2. 再次修改完成后,创建first commit - 2/2(Hash值为f85512d)。liyane@Yans-MacBook-Air gittoken % git add test.txt
liyane@Yans-MacBook-Air gittoken % git commit -m "first commit - 2/2"
[main f85512d] first commit - 2/2
...
#查看commit 日志。HEAD指针直接指向first commit - 2/2(Hash值为f85512d)。
liyane@Yans-MacBook-Air gittoken % git log
commit f85512d8ee64bbfd064926a5b3f4ea4e702ba489 (HEAD -> main)first commit - 2/2
commit ca8bcbc51b2892e672013a66efae03c3662e6e10 (origin/main)
...
小结:
- github通过移动HEAD指针来标记和管理代码commit。
- 使用git reset命令可以重新设置HEAD指针。支持指定后退次数。比如HEAD~3回退最近3次commit。commit按次序表示(HEAD, HEAD~ 或者 HEAD^,HEAD~2,HEAD~3)。
- SOFT模式只做HEAD指针的重置。它不会重置index file和working tree,这意味着将保留文件的修改。
而HARD模式将重置index file和working tree。 - 可以使用git reset --help命令查看具体的用法。
- 如有任何问题,欢迎留言讨论。