前言
这个教程根据我的个人理解和实践,所以请我们多多指教。过错之处,欢迎评论指出,便利我们也能参考.有时间的话我也很乐意及时的进行改正。假如教程中有表述不清楚的地方,也请指出,或供给主张。
在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
参数时,仅影响暂存区,将已暂存的文件改变康复至作业区版本,但不会影响当前作业目录下的文件内容。
- 不带stage参数时,效果类似于
总归,在进行任何Git回退操作时,请必须审慎对待,保证了解每个操作的潜在影响,尤其是在多人协作和现已推送了代码的情况下。