前言

这个教程根据我的个人理解和实践,所以请我们多多指教。过错之处,欢迎评论指出,便利我们也能参考.有时间的话我也很乐意及时的进行改正。假如教程中有表述不清楚的地方,也请指出,或供给主张。

Git操作中,针对不同阶段的回退和复原操作有如下细分:

作业区:未add

举例:针对代码文件进行了修正,可是还没有add的时分,这个时分假如懊悔了,想康复到修正之前的状况,依照我曾经的操作可能便是一顿ctrl z进行撤回,可是吧,假如修正的内容不多,还好,几秒就完事儿,可是假如修正的文件多,就可以运用另外的方法。

处理:若要吊销对文件的修正并康复到上一次提交的状况,在履行git add之前,可以运用指令git checkout -- <file>或许指令git restore <file>(不带--staged参数)。这将丢弃作业区中的一切未暂存更改。

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   one.txt
no changes added to commit (use "git add" and/or "git commit -a")
------------------------------
$ git restore one.txt
------------------------------
$ git status
On branch master
nothing to commit, working tree clean
------------------------------

暂存区:(已add但未commit)

举例:针对代码文件做了修正,并且也add了,可是这个时分假如懊悔了,想康复到修正之前的状况。此时不能运用上面的方法,可是我们仍然有办法。

处理

  • 关于已增加(add)到暂存区但还未提交(commit)的改动,要撤回到作业区(未add)状况,如代码中提示可运用git restore --staged <file>。此指令会从暂存区移除指定文件的更改,让其回来至作业区,保存修正但不再处于暂存状况。
$ git add one.txt
------------------------------
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   one.txt
  • 若想继续将文件康复至最终一次提交时的状况(即既吊销暂存又吊销修正),可点击作业区回退方案参考。

本地库房:(已commit但未push)

举例:针对代码文件进行了修正,现已add且commit了,可是由于各种原因,不想把commit提交到长途库房,便是不想push了,想撤回到修正之前。

处理

  • 要吊销最近的一次提交但保存修正以便重新提交,可以运用git reset HEAD~1(或指定commit ID)。这会将HEAD指针移动到前一个提交,并将更改保存在作业区和暂存区。
$ git commit one.txt -m 'first commit'
[master 251478b] first commit
 1 file changed, 1 insertion( )
------------------------------
$ git reset HEAD~1
Unstaged changes after reset:
M       one.txt
------------------------------
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   one.txt
no changes added to commit (use "git add" and/or "git commit -a")
  • 若要完全回滚到某个提交且丢弃之后的一切更改(包括作业区和暂存区的),运用git reset --hard <commitID>。请慎重运用此指令,由于它会永久删去未提交的改动。
$ git log
commit 52a9699a8eb50940d59bb54cbacd036f412aa261 (HEAD -> master)
Author: 郝乾维 <haoqw@primeton.com>
Date:   Thu Feb 1 17:23:51 2024  0800
    second
......
......
......
------------------------------
$ git reset --hard 52a9699a8eb50940d59bb54cbacd036f412aa261
HEAD is now at 52a9699 second
------------------------------
$ git status
On branch master
nothing to commit, working tree clean
  • 若要创立一个新的提交来吊销先前提交的影响而不改变历史记录,运用git revert <commitID>,它会产生一个新的反向补丁提交。
$ git log
commit f020061fb81e14b555cb79d71eaa0e1291c748aa (HEAD -> master)
Author: user1 <user1@primeton.com>
Date:   Thu Feb 1 17:29:43 2024  0800
    three
commit 52a9699a8eb50940d59bb54cbacd036f412aa261
Author: 郝乾维 <haoqw@primeton.com>
Date:   Thu Feb 1 17:23:51 2024  0800
    second
......
......
......
------------------------------
$ git revert f020061fb81e14b555cb79d71eaa0e1291c748aa
[master 4e02426] Revert "three"
 1 file changed, 1 insertion( ), 2 deletions(-)
------------------------------
$ git status
On branch master
nothing to commit, working tree clean

长途库房(慎之又慎):push之后

  • 回滚已推送的提交需要分外当心,由于这可能会影响其他协作者的作业流程。通常情况下,应当避免直接修正历史记录,而是通过创立新的revert提交来处理问题:
  • 运用git revert <commitID>生成一个新的反转提交,处理抵触后提交并推送到长途库房:git push

关于git restore弥补说明:

  • git restore指令可用于康复文件的不同状况:

    • 不带stage参数时,效果类似于git checkout -- <file>,不管文件是否被add过,都会将其内容康复到最近一次提交的状况,并清除任何未提交的修正。
    • --staged参数时,仅影响暂存区,将已暂存的文件改变康复至作业区版本,但不会影响当前作业目录下的文件内容。

总归,在进行任何Git回退操作时,请必须审慎对待,保证了解每个操作的潜在影响,尤其是在多人协作和现已推送了代码的情况下。