Git命令汇总

为了方便查阅,在这边做一个小结

版本回退

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本,类似的还有git log --pretty=onlinegit log --graph

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

撤销修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,执行git reset --hard commit_id,不过前提是没有推送到远程库。

删除文件

删除本地rm file

场景1:如果删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本 git checkout -- test.txt

场景2:真正删除 git rm file删掉,并且git commit

添加远程库

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容

从远程库克隆

git clone

创建与合并分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:先切换到<name>分支,然后执行git merge <name>

删除分支:git branch -d <name>

分支管理策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

image

Git在做merge时会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息,我们不想丢掉信息就需要这样做,git merge --no-ff -m "merge with no-ff" dev其中--no-ff参数,表示禁用Fast forward

image

暂存

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。可以使用git stash list查看已暂存的内容

多人协作提交代码的流程

查看远程库信息,使用git remote -v

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

rebase

在多人开发模式下,往往很容易发生冲突,有些小伙伴往远端推送以后发现莫名其妙会多一个commit,导致不能是一条干净的直线,强迫症标识根本受不了。像下图一样,这时可以使用git rebase解决问题

image

我们在pull时也可以加这样的参数 git pull --no-commit --rebase origin master来解决问题

解决后的样子

image

如果感到很疑惑这边推荐两个很不错的学习资料:git book廖雪峰的官方网站

对比

git diff commit-id-1 commit-id-2 --stat

忽略某个文件

git update-index --assume-unchanged config.xml