git是我们常用的代码提交工具,但是有很多命令行要记,对于习惯这些命令的新手来说是一件很蛋疼的事,故本人在此记录了一些常用的命令,以供大家参考。如有不对之处,还请各位大虾多多指正。
git代码克隆
1.主模块代码拉取
主模块拉取的命令很简单,相信用过git的童鞋都会:
git clone https://github.com/bendidi/Tracking-with-darkflow.git
2.子模块代码拉取
将主模块代码拉取下来以后会发现主体工程代码目录下面有一些空目录,如deep_sort、sort、darkflow,这些子模块均为空目录。原因是这些目录均为submodule,隶属于第三方的git工程。这是为了解决不同git工程之间能够相互引用,而彼此之间又能保证相互独立才引入子模块的概念。拉取子模块的方法如下:
git submodule update --init --recursive
如果你细心观察,你会发现包含子模块的工程主目录下都会存在一个.gitmodules(隐藏文件),里面的内容如下:
[submodule "deep_sort"]
path = deep_sort
url = https://github.com/bendidi/deep_sort.git
[submodule "sort"]
path = sort
url = https://github.com/bendidi/sort.git
[submodule "darkflow"]
path = darkflow
url = https://github.com/bendidi/darkflow.git
文件中记录的子模块对应的文件名和git路径,git submodule update --init --recursive就是根据此文件来拉取子模块工程
3.同时拉取所有模块代码
看完上面两步之后,估计很多童鞋心里都有个疑问:
我拉取个代码还搞这么麻烦,有没有简单一点的方法,可以一步到位?
这位老细你有运了,我这里刚好有一粒:
git clone --recursive https://github.com/bendidi/Tracking-with-darkflow.git
给git clone传递--recursive选项,git clone命令会自动初始化并更新仓库中的每一个子模块。
正常代码提交流程
git正常的代码提交流程可以分为以下几步:
1.文件的增删改
1.git add $(filepath)/filename
在git中增加需要增加或者修改的文件名
2.git rm $(filepath)/filename
在git中删除指定文件路径的文件
3.git mv filename1 filename2
修改移动指定文件名
4.git status
查看当前代码提交状态,可根据提交状态来校对目前的修改跟预期的提交是否相符。
2.代码的本地提交
经过第一步的代码的增删改操作后,将进入本地提交环节,提交后代码将保存在本地,但不会上传的git服务器,操作命令如下:
git commit
提交时如须添加修改备注,可以在git commit -m "备注信息:xx修改",也可以在git commit后的命令行中添加。
本地提交之后,有时你会发现,还有其他的改动忘了提交,怎么办呢?
很简单,将忘了提交的改动重新走一遍步骤1,然后使用:
git commit --amend
进行追加提交,即可完成本地补充提交代码。
3.代码的远程服务器提交
当代码提交到本地后,就可以将代码提交到主干,命令如下:
git push origin HEAD:refs/for/master
主干上版本更新后如何合并提交自己的代码
按正常提交流流程commit代码后,若主线版本比本地版本新,直接提交代码到主线将会报冲突,此时可以尝试使用如下方法来解决:
1. git stash
git stash用于将当前工作区的修改暂存起来,就像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区
2. git pull
拉取线上最新代码.
3.git stash pop
恢复/合并线上代码和自己的代码
此时再将代码提交到主干将不会报冲突,但新代码和自己修改的代码有没有相互重叠的修改导致不可预测的后果,需要提交者自己检视代码来保证。
代码回退
1.git log
查看最近代码提交日志,可以按上下箭头浏览,内容如下:
2.git checkout $(committed)
使用git checkout $(committed)可以将代码回退到指定的提交版本
如果代码回退后需要恢复到当前主线最新版本,可以使用:
git reset --hard origin/master
将代码恢复到当前主线最新版本。
reset之后如何恢复到上一次commit点
1.git reflog
使用git reflog查看之前的commit记录,如下所示:
$ git reflog
b7057a9 HEAD@{0}: reset: moving to b7057a9
98abc5a HEAD@{1}: commit: more stuff added to foo
b7057a9 HEAD@{2}: commit (initial): initial commit
2.git reset --hard 98abc5a
reset完后代码即可回退到之前提交的版本
reset --hard 和checkout的区别
1.git reset --hard $(committed)
放弃本地修改,将代码回退到指定commit版本,本地代码的HEAD也会随着本次reset的提交点而移动到对应的分支/主线
2.git checkout $(committed)
放弃本地修改,将代码回退到指定commit版本,本地代码的HEAD不会随着checkout的commitid移动。
区别:
1.checkout对工作目录时安全的,它会通过检查来确保不会将已更改的文件弄丢。而 reset --hard 则会不做检查就全面地替换所有东西。
2.使用git reset --hard时HEAD会随着commit的不同而移动,而使用git checkout时HEAD不会随着commit点的不同而移动。