近来在学git。

话说用github两年了难道还不会git么?当然是会一点的,也就是init,diff,status,add,commit,push,clone几个命令,连版本回退都不会,更不用提分支处理什么的了。。。所以现在跟着廖雪峰的Git教程系统地学习一下.

1.创建版本库

1
git init

2.添加文件到仓库

1
git add <file> //可以git add * 一次性全部添加

3.提交修改

1
git commit -m "commit message"

4.查看当前状态(有哪些文件增删修改过)

1
git status

5.查看具体修改的内容

1
git diff <file> //可以不带file,直接对比全部增删修改过的文件

6.查看提交历史

1
2
3
git log
git log --pretty=oneline //显示得更简洁
git log --graph //可以看到分支图

7.版本回退/恢复

1
2
3
git reset --hard HEAD^ //回退一个版本
git reset --hard HEAD~2 //回退两个版本
git reset --hard HEAD~100 //回退一百个版本

此命令会将当前内容回退到上次提交的内容。而若想直接回退/恢复到某一个版本:

1
git reset --hard d63288

其中d63288是想回退/恢复到的提交的版本号的前几位,版本号没必要写全,只写前几位即可。

8.查看命令历史

1
git reflog

如果不知道想回到的提交的版本号,可通过上面的命令查询git命令历史,找到想要的版本号。

9.撤销工作区的修改

1
git checkout -- <file>

可以让file在工作区发生的修改全部撤销,用用暂存区或版本库中的替换之。(即回退到上一次git add或git commit时的状态)

10.撤销暂存区的修改

1
git reset HEAD <file>

如果修改已经被提交到暂存区,可使用上述命令将已提交到暂存区的修改删除,让暂存区的此文件与已经commit的版本库中的文件版本保持一致。

11.文件删除

1
git rm <file>

如果某个已经在暂存区或版本库的(一定经过了git add)文件被删除,那么无法通过git add将文件删除的修改提交到暂存区。只能通过git rm该文件将文件从版本库移除。然后再commit即可。

12.克隆远程版本库

1
git clone <ssh-url>/<https-url>

类似于SVN的版本库导出到本地。

13.关联远程库

1
2
git remote add origin <ssh-url>
git push -u origin master

第一条命令可将本地git仓库关联到远程库上。第二条是将本地所有内容提交上去。与SVN类似,如果远程仓库不是空的,那么需要先pull和merge才行,第二条命令会失败。

这里由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

14.创建/切换分支

1
git checkout -b dev //创建并切换到dev分支

此命令等同于以下两条命令:

1
2
git branch dev //创建dev分支
git checkout dev //切换到dev分支,如果本地有未提交的代码,分支切换会失败

15.查看分支

1
git branch

16.合并分支

1
2
3
git checkout master
git merge dev //将dev分支上已提交的内容合并到master,如果本地有未提交的代码,该命令会失败。两遍都已经提交的部分如果有冲突需要手动解决
git merge --no-ff -m "merge with no-ff" dev //普通模式合并

17.删除分支

1
git branch -d dev

18.储存工作现场

1
git stash

19.Bug分支场景

场景说明:当前正在dev分支上做开发,开发工作尚未完成不能提交。此时接到一个id为101的bug,需要在master分支上立即修复。

对应操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git status //查看当前状态,应该会有很多modified文件、new文件什么的
git satsh //保存当前工作状态
git checkout master //切换到master分支
git checkout -b bug-101 //从master分支新建一个临时分支用于改bug
... //解决bug中
git add * //add修改
git commit -m "fix bug 101" //提交修改
git checkout master //切换到master分支
git merge --no-ff -m "merge bug fix 101" bug-101 //bug修改合并到master
git branch -d bug-101 //删除临时的bug分支
git checkout dev //改完bug,回到dev分支
git stash list //查看stash列表
git stash apply stash@{0} //恢复stash
git stash drop stash@{0} //删除此stash(apply和drop的过程可以用git stash pop一条命令替代)

20.强行删除分支

1
2
3
git branch -D <name>
//删除远程分支但不删除本地分支:
git push origin :<name>

如果一个分支的里有一些commit的内容没有合并到其他分支,直接删除会提示错误。需要用大D参数强行删除。

21.查看远程库信息

1
git remote -v

22.推送分支

1
2
git push origin master
git push origin dev

23.抓取分支

1
git checkout -b dev origin/dev

别人从git上clone,默认只能看到master分支。想要看到dev分支,需要执行上述命令。

24.指定本地分支与远程分支的链接

1
git branch --set-upstream dev origin/dev

25.多人协作工作场景

1
2
3
4
5
git push origin branch-name //推送自己的修改
git pull //如果推送失败,则因为远程分支比你的本地更新,需要先试图合并
... //如果合并有冲突,则解决冲突,并在本地提交
git push origin branch-name //再次尝试推送!
git branch --set-upstream branch-name origin/branch-name //如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用此命令链接

26.创建标签

1
2
3
git tag v1.0 //默认在当前版本打tag
git tag v0.9 9241fd //在之前某个版本打tag
git tag -a v0.8 -m "version 0.8 released" 3628164 //给标签添加说明

查看tag列表:

1
git tag

查看tag具体信息:

1
git show v1.0

27.操作标签

1
2
3
4
git tag -d v0.1 //删除标签
git push origin v1.0 //标签默认都储存在本地,推送某个标签到远程需要手动推送
git push origin --tags //推送所有标签
git push origin :refs/tags/v1.0 //可以删除一个远程标签。

28.删除错误的commit

1
2
git reset --hard <commit_id>
git push origin HEAD --force

回退到之前的某一个版本,然后强推到服务器。注意服务器如果有分支保护需要先关闭。

EOF