Git细节

ppgo8 于 2023-09-24 发布

Git细节

工作区有未提交文件,切换分支会发生什么?

一个版本库只有一个工作区和暂存区,但是有多个分支。

切换分支就是切换的head指向,但是工作区和暂存区不变。


当工作区的改动未提交时,依旧可以切换分支,在其他分支也会看到工作区未提交的修改。

(有时候也无法切换分支,原因如切换时会提示会覆盖另一个分支文件的内容,也可强制切换git checkout branchname -f ,最好不要强制切换,会丢失之前分支的修改内容,可以先stashcommit,再切换)

不让其他工作区看到未提交修改的方法:

原因

一个本地的git repo只有一个工作区和暂存区,但是有多个分支的提交区,而我们的checkout只是将HEAD指针从一个分支切换到另一个分支。

丢弃工作区的修改内容

还存在工作区的修改内容有两种情况:

  1. 未提交到暂存区
  2. 已提交到暂存区,但是没提交到版本库

针对不同的情况需要做不同的操作:

  1. 没有git add

    使用git checkout -- filename撤销修改,回到和版本库一模一样的样子

    git checkout -- .撤销所有没add的修改

  2. 已经git add

    先使用git reset HEAD filename

    使用git checkout -- filename 文件进行修改撤销。

  3. 已经git add,并再次进行修改

     先使用git checkout filename,文件就会变成添加到暂存区后的状态,也就转换成了“第二种情况”。

恢复暂存区的指定文件到工作区
$ git checkout -- [file]

恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
恢复暂存区的所有文件到工作区
$ git checkout -- .
重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
新建一个commit,用来撤销指定commit
后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop

删除未跟踪文件

# 删除 untracked files
git clean -f
 
# 连 untracked 的目录也一起删掉
git clean -fd