/ GIT

Git命令学习

港真,大厂里不会git寸步难行啊,因此还是踏踏实实好好学习一哈吧。

一. 配置git及常用命令

1.1 安装和配置

  • 安装git: * Windows下安装:推荐使用scoop进行安装scoop install git * Mac下安装:推荐使用brew进行安装brew install git
  • git相关配置 * 配置用户名:git config --global user.name "XX" * 配置Email:git config --global user.email "XX@xx.com" 在安装完成后,我们可以打开~/.gitconfig文件进行查看相关配置

1.2 git的常用命令

这里推荐一些git相关常用的命令(简单的):

  • 初始化仓库:git init
  • 查看git缓存区状态:git status
  • 提交所有的修改到缓存区:git add -A
  • 提交指定文件到缓存区:git add file_name
  • 清除缓存区内的所有文件:git rm --cached files
  • 提交缓存区内的文件到本地仓库:git commit -m "fix"
  • 将本地仓库和远程仓库进行连接:git remote add origin http:....git
  • 将本地仓库推送到远程仓库:git push -u origin master ,这里讲下orgin其实指的是远程仓库,而master指的是本地分支名。
  • 从远程仓库拉取代码到本地仓库(并合并):git pull

二. 分支和合并

2.1 查看日志

查看git日志的命令:git log

我们可以参考漂亮日志,可以使用图形化一行来展示日志:git log --all --decorate --oneline --graph

这里的命令过长,因此我们可以修改.gitconfig文件中的配置,添加如下所示

[alias]
        dog = log --all --decorate --oneline --graph

即可使用git dog来查看日志了。

2.2 分支和合并命令

分支的意义:将修改记录的整体流程做一个分叉的保存,每个分支都不会受其他分支的影响,且每个分支都可以合并到主分支上。

  • 本地创建一个分支:git branch branch_1,注意这里是在当前分支下新开的小分支,因此新开的分支下有前一个分支的所有内容。

注意:我们在本地仓库初始化后想要添加一个分支,注意这里必须要保证master分支下是有文件的,不然会报错fatal: 不是一个有效的对象名:'master'

  • 查看当前分支:git brach,我们可以看到如下图所示,目前我们创建了一个新分支,但是还在master分支下,并没有切换到branch_1分支下(* 即代表当前所处的分支)

  • 切换到指定分支:git checkout branch_1,这里如果是想直接新建一个分支并切换到该分支下,即可用命令git checkout -b branch_2
  • 删除本地分支:git branch -d branch_1
  • 合并分支branch_1:git merge branch_1

2.3 应用的小栗子

删除分支栗子

当我们在分支branch_2 下新建了一个b.txt文件后commit提交了,然后切换会master分支下时,想删除分支branch_2,却发现报错:error: 分支 branch_2没有完全合并。如果您确认要删除它,执行git branch -D branch_2。

这是因为branch_2里面已经做了一些变动,且没有将branch_2的内容合并到master,因此报错。这里你可以:

  • 强制删除:git branch -D branch_2
  • 合并在branch_2中修改的内容到master:git merge branch_2

提交分支到远程的栗子

我们创建了branch_2和branch_1分支,然后切换到master分支下后git push,那么远程仓库中并不会生成这两个分支,那么如何将两个分支推到远程仓库呢。你可以:

  • 切换到branch_2分支下:git checkout branch_2
  • 向远程仓库推送当前分支:git push origin branch_2 ,这里同时会在远端创建branch_2分支。

如何在远程仓库中删除刚创建的branch_2分支呢:git push origin :branch_2即可。

如何在远程仓库不叫branch_2这个分支名:git push origin branch_2:br2即可。

查看git日志的栗子

当我们在分支branch_2 下新建了一个b.txt文件后commit提交了之后,通过git merge branch_2来合并到master上,来查看下日志:git dog,如下图所示 我们会发现这次提交是master还是branch_2的操作,因此我们需要git帮我们创建一次合并的commit,帮助我们区分啥时候发生的合并:git merge branch_2 --no-ff,这时候看日志就是如下图所示

在上图我们可以看到git日志中先是分支branch_2(可以看到发生了分叉)添加了内容,然后合并到了master上,十分清晰明了。

分支冲突的栗子

我们的branch_2是基于branch_1进行创建的,然后我们在branch_2中修改了a.txt内容,并commit提交。然后在切换回branch_1,同时也修改了a.txt内容,依然commit提交。这个时候branch_2的同学想要基于branch_1的同学来修改代码继续做,因此branch_2会合并branch_1,即git merge branch_1,这时候就会发生分支冲突。那么解决冲突的方式就是去修改a.txt中的内容。

这里推荐使用命令git mergetool来进行修改,如下图所示。

三. 回滚

我们提交之后发现想回滚到之前的提交下,如下图所示

  • 想要回滚一次:git reset master^
  • 回滚4次:git reset master~4
  • 回滚到指定的版本处:git reset --hard 01ff736 (添加–hard会将工作目录和暂存区的文件都丢弃掉,而–soft 则是仅丢弃暂存区的内容,而工作目录下的文件依旧保存)

  • 回到后面的版本: git reset --hard 6556432,这时又能回到之前的版本,所以这里的reset跟类似于跳转某个版本

直接commit提交之后需要撤销掉

  • 撤销git commit,撤销git add,保留编辑器改动代码:git reset --mixed <commit ID>或git reset <commit ID>
  • 撤销git commit,不撤销git add,保留编辑器改动代码:git reset --soft<commit ID>
  • 撤销git commit,撤销git add,删除编辑器改动代码:git reset --hard <commit ID>

四. gitignore

我们经常发现,在使用git上传到远程仓库的时候,总是会把一些IDE或者一些自己不想放到远程的文件/文件夹放到远程,这时候就需要创建gitignore文件指定某些文件/文件夹不上传远端,即touch .gitignore

*.txt ==> 忽略所有的txt文件
model/ ==> 忽略model文件夹
!*.py ==> 不要忽略所有的py文件

注意:需要记得把.gitignore文件commit!不然无法生效。