Git实用命令指南
1. 团队工作基本模型
建立初始远程仓库->各人拉取远程仓库到本地->建立自己的开发分支->开发完成后push
新的分支到远程仓库,以保存且同步->review
代码后无问题,合并到master
分支
2. 创建并切换到自己分支工作
查看所有分支
git branch -a
说明:后面的参数-a
表示查看所有的分支,主要应用于从远程pull
下来的分支,因为远程拉过来的分支非自己创建的,所以直接git branch
看不到
切换分支
git branch <分支名>
创建并切换到这条分支
git checkout -b <分支名>
把当前分支push到远程
git push origin <分支名>
说明:第一次创建远程没有的分支时,push
需要带上分支名。后面git push
不加参数时,就会默认推送到这个指定的分支了。
推送分支且和远程分支同步
git push origin <分支名> -u
说明:可以发现用上面的git push
后,虽然把本地的分支推送上远程仓库了,但是此时想要git pull
的话,会出现类似于这样一个提示

意思就是说当前这个分支还没有远程跟踪,所以没有办法拉取远程代码。而在git push
后面加一个-u
就是解决这个问题。当然了,也可以不加这个参数,然后在pull
的时候按照这个命令提示,加上远程分支的跟踪。
3.拉取远程仓库
初始拉取远程仓库
git clone <git仓库链接>
说明:git clone
操作会拉取远程仓库的所有分支,不过拉下来后默认是处于master分支,可以使用git branch -a
来查看所有的分支。使用git checkout <分支名>
来切换到指定分支。
同步远程代码到本地
git pull
说明:git pull
不加分支名,表示拉取远程仓库所有默认同步的分支。这里默认同步的分支是初次git clone
的时候远程仓库里包含的分支。git clone
之后,远程仓库新添加的分支,则是拉不到的。如果要拉取新的分支,就需要指定分支名:git pull origin <分支名>
。
3. 文件的三种状态以及各自的撤销方法:
- 未加入暂存区
git checkout <文件名>
- 已加入暂存区,未提交更改
git reset HEAD
- 已提交更改
git reset --hard HEAD^
4. 快捷提交(add+commit)
git commit -a
5. 合并分支
假设当前HEAD
在master
上,需要合并feature1
的分支
git merge feature1
这里会有这几种情况:
-
master
分支和feature1
分支产生分叉,那么git会把feature1
分支从分叉的地方开始的所有的更改内容合并到master
上,并生成一个新的commit
。但是master
分支里不会有feature1
分支的commit
记录。 -
master
分支和feature1
分支没有分叉且feature1
分支领先于master
分支。换言之,从master
拉出feature1
分支后,master
分支一直没有任何提交,只有feature1
分支有提交内容。此时git会执行fast-forward
操作,直接把master
和HEAD
移动到feature1
的位置上。同时master
也会包含feature1
的所有commit
历史。此时master
和feature1
处在同一commit的节点。 -
master
分支和feature1
分支没有分叉且master
分支领先于feature1
分支。换言之,从master
拉出feature1
分支后,feature1
分支一直没有任何提交,只有master
分支有提交内容。此时git不会执行任何操作,命令行会提示Already up to date
。反过来,切换到feature1
分支,然后执行git merge master
,可以将HEAD
和feature1
移动到master
的位置。与上面同理,feature1
也会包含master
的所有commit
历史。此时master
和feature1
处在同一commit
节点。(这也映证了分支并无主次之分,所有分支都是平等的,并不会因为有的分支叫master
就会针对它会有一些特殊性。--这是git的特性,github还是有写区别的)
6.实用黑科技
stash:临时存放工作目录的改动。在 Git 中,stash
指令可以帮你把工作目录的内容全部放在你本地的一个独立的地方,它不会被提交,也不会被删除,你把东西放起来之后就可以去做你的临时工作了,做完以后再来取走,就可以继续之前手头的事了。
具体说来,stash
的用法很简单。当你手头有一件临时工作要做,需要把工作目录暂时清理干净,那么你可以:
git stash
就这么简单,你的工作目录的改动就被清空了,所有改动都被存了起来。
重新取出这个缓存继续之前的代码编写:
git stash pop
说明:
没有被 track
的文件(即从来没有被 add
过的文件不会被stash
起来,因为 Git 会忽略它们。如果想把这些文件也一起stash
,可以加上 -u
参数,它是 --include-untracked
的简写。就像这样:
git stash -u
参考链接:
git push与pull的默认行为 https://segmentfault.com/a/1190000002783245