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!不然无法生效。