git使用

132 阅读6分钟

1 分支

1.1 切换分支

1.1.1 git切换分支分支切换会改变你工作目录中的文件

  比如,在master分支下有1.txt、2.txt两个文件;但是在dev分支下增加了3.txt文件;当从master分支切换到dev分支的时候工作区的内容就会由只有1.txt、2.txt两个文件变成有1.txt、2.txt、3.txt三个文件。

注意:
  切换分支的时候如果当前分支有未提交的修改或者未提交的暂存,那么这些未提交的修改或者未提交的暂存就会被带到切换的分支中,会对切换的分支造成污染(这其实也很好理解,在master分支下做的修改没有提交,那git不可能将这些修改在切换分支的时候丢掉那只能带到切换的分支中去了)。
  举个例子:在master分支下修改了2.txt,但是没提交,直接切换到dev分支,那么这时对2.txt的修改就会带到dev分支的工作目录下,对dev分支造成了污染。因此,在切换分支的时候,最好是都需要提交一下当前分支上的内容

1.1.2 stash存储

有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。 针对这个问题的答案是:git stash

git stash命令会将未完成的修改保存到一个栈上,而你可以在任何时候重新应用这些改动(git stash apply)

  • git stash list查看存储
  • git stash apply stash@{2}如果不指定一个储藏,Git认为指定的是最近的储藏。栈中存储的修改的名称stash@{2}。
  • git stash pop来应用储藏然后立即从栈上扔掉它,相当于git stash applygit stash drop的结合
  • git stash drop stash@{2}加上将要移除的储藏的名字来移除它

1.2 远程跟踪分支

1.2.1 什么是远程跟踪分支?

远程跟踪分支是远程分支状态的引用。它们是你不能移动的本地分支。当你做任何网络通信操作时,它们会自动移动。它们以 (remote)/(branch) 形式命名,例如,如果你想要看你最后一次与 远 程 仓 库 origin 通信时master分支的状态,你可以查看origin/master分支

1.2.2 远程跟踪分支会自动创建

  • git中理解三个分支:本地分支、远程跟踪分支、远程分支(github上的分支)。远程跟踪分支就是本地分支和远程分支之间的桥梁。
  • 远程跟踪分支是不需要我们创建的:项目经理初次push仓库的时候会自动创建远程跟踪分支,成员在clone的时候也会自动创建远程跟踪分支,即push、clone的时候都会自动创建远程跟踪分支,同样的push本地分支的时候远程仓库中也会自动创建对应的远程分支。

1.2.3 如何将本地分支推到远程,远程分支拉到本地?

举个例子:
  A现在需要创建一个新的dev分支(git branch dev),将新分支推到远程仓库(git push origin(远程仓库名) dev(分支名)),这时远程参考也会有一个dev的远程分支。对A而言他本地有一个dev的分支,同时push的时候也自动生成了一个remotes/origin/dev的远程跟踪分支。
  此时B如果也想获取一个和远程dev分支对应的本地dev分支可以这样操作:首先可以fetch拉下来github中dev对应的远程跟踪分支origin/dev,再建一个本地分支dev,将本地分支dev和远程跟踪分支origin/dev进行merge,B也得到一个和github上的远程分支dev对应的本地分支dev了。

2 更新本地仓库

2.1 pull和fetch的区别

git pullgit fetch都可以起到更新本地仓库的作用,但二者有所不同。
举个例子: 现在B本地仓库的master分支和远程仓库的master分支都是最新的,A此时向远程仓库提交了一份更新,此时远程仓库的master就指向的是最新的版本了。如果B使用git fetch那么就会将就A提交的更新拉去到远程跟踪分支origin/master上,本地分支master上并没有获取到A的更新,还需要将本地的master分支和origin/master分支进行合并。而如果使用git pull就不需要在进行master和origin/master的合并了,二者已经完成合并了。因此,git pull = git fetch + git merge origin/master

3 后悔药

这里所说的撤销当然都是简历在文件被git跟踪过了的基础上,如果一个文件是新添加的,都从来没有被git跟踪过的话,是无法撤回的。

3.1 撤销工作区的修改

  • 命令:git checkout --文件名
  • 作用:将在工作目录中对文件的修改撤销
  • 注意:是一个危险的命令,这很重要。 你对那个文件做的任何修改都会消失 - 你只是拷贝了另一个文件来覆盖它。除非你确实清楚不想要那个文件了,否则不要使用这个命令。(同时,这里我们可以看到使用checkout进行目录的覆盖,同理切换分支的时候也是使用的覆盖,改动了HEAD、工作区、暂存区)

3.2 撤销暂存区的提交

  • 命令:git reset HEAD 文件名
  • 作用:将文件从暂存区中撤回到工作目录

3.3 撤销本地代码库中的提交

对于已经提交到本地代码库中的提交,其实不存在撤回的,如果是写错了,提交尽代码库了,直接再重新提交一次就好了,覆盖掉前面一次的提交。

  • 命令: git commit --amend
  • 作用:这个命令可以修改已经提交的注释。

如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。如果你提交后发现忘记了暂存某些需要的修改,可以像下面这样操作: git commit -m 'initial commit' git add forgotten_file git commit –amend

最终你只会有一个提交 - 第二次提交将代替第一次提交的结果

4 查看历史记录

4.1 git log和git reflog的区别

  • git log可以显示所有提交过的版本信息,不包括已经被删除的 commit 记录和 reset 的操作
  • git reflog是显示所有的操作记录,包括提交,回退的操作。一般用来找出操作记录中的版本号,进行回退。 git reflog常用于恢复本地的错误操作。

5 解决冲突

5.1 git mergegit rebase

两者都可以合并分支,解决冲突,但是如果多人开发merge的时间很混乱的话,最终merge形成的分支图就会很混乱,而使用rebase形成的分支图就会比较干净,有利于后续查找谁的代码出了问题。

使用场景举例:
  

2022-03-27_120654.JPG