1.git常用命令篇
//1.初始化仓库
git init
//2.添加文件
git add file.txt
//3.查看状态
git status
//4.查看改动内容
git diff file.txt
//5.提交到仓库
git commit -m 'modify file.txt'
//6.查看提交历史记录
git log
说明
:git log命令可以查看历史提交记录,方便历史版本回退,怎么回退历史版本呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交d9c4e8b…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,
上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在,我们要把当前版本modify as.c回退到上一个版本fixed the file as.c bug,就可以使用git reset命令:
//7.版本回退
git reset --hard HEAD^
//8.删除文件
git rm file.txt
git commit -m 'remove file.txt'
2.远程仓库篇
默认已经将公钥加入远程仓库,没有的话参考:链接
//1.关联远程仓库
git remote add origin git@server-name:path/repo-name.git
//2.第一次推送master分支
git push -u origin master
//3.之后推送master分支
git push origin master
3.git从已有分支拉新分支开发
从master分支copy一个开发分支,使用一下完成操作
1.1切换到被copy的分支(master),并且从远端拉取最新版本:
git checkout master
git pull
1.2.从当前分支copy新的分支,并切换分支
git checkout -b dev
//查看分支
git branch
1.3.把新建的分支push到远端:
git push origin dev
1.4.拉取云端分支
git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
经过验证,当前分支并没有和本地分支关联,根据提示进行下一步:
1.5.关联
git branch --set-upstream-to=origin/dev
注意:–set*之后的参数没有空格
1.6.再次拉取 验证:
git pull
4.分支合并命令篇
4.1创建与合并分支
//1.创建并切换分支
git checkout -b dev
git switch -c dev //新版本支持switch命令切换分支
//2.查看分支
git branch
//3.合并dev分支到master
git checkout master
git merge dev
//也可以加参数 --no-ff,表示禁用Fast forward
git merge --no-ff -m 'merge with no-ff' dev
//4.删除分支
git branch -d dev
//5.删除远程分支
git push origin --delete dev
4.2分支策略
- 实际开发中,master分支应该是非常稳定的,只能用来发布新的版本,平时不能在上面干活
- 开发都在dev分支上完成,团队合作的分支看起来如下
4.3Bug分支
如果正在dev上进行开发,工作还未提交,这时有个紧急的bug需要修复,怎么办?
可以用stash
功能"储藏"起来,bug修复后恢复现场继续工作
$ git statsh
现在就可以切换到要修复bug的分支上,创建新的分支issue-*
如:
$ git checkout master
$ git checkout -b issue-101
......//执行bug修复工作
$ git switch master //切换到master分支
$ git merge --no-ff -m 'merged bug fix 101' issue-101
修复完成bug可以继续回到dev工作
//切换分支
$ git switch dev
//查看工作区,此时工作区是干净的
$ git status
//查看暂存内容
$ git stash list
//恢复之前暂存的工作区
$ git stash pop
思考区:在master分支上修复了bug,如果dev分支是早起从master分支分出来的,那么这个bug在dev分支上也存在,dev分支的bug怎么修复呢?
git解决方法:使用 cherry-pick
命令,将修复bug的那次提交“复制”到dev分支
//查看分支,确定在dev分支上
$ git branch
//合并到dev,后面的‘4c80512’表示修复bug的commit id前几位,根据自己的实际产生的id修改
$ git cherry-pick 4c80512
4.4 feature分支
软件开发中,每添加一个新功能,最好新建一个featrue分支,在上面开发,完成后,合并,最后删除该feature分支。
$ git switch -c feature-vulcan
......//进行代码开发
$ git add *
$ git commit -m 'add feature vulcan'
//切换到dev分支,准备合并
$ git switch dev
正常的话合并,然后删除,但是,如果此时突然老板说该功能不要了,需要就地销毁,我们执行如下命令
$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
销毁失败,git提醒需要使用-D
参数
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).
小结:
要删除一个没有被合并过的分支,可以通过git branch -D <name>
命令
4.5 多人协作
推送分支
//1.查看远程仓库信息
$ git remote
或者
$ git remote -v //显示更详细信息
//2.推送分支
git push origin master
git push origin dev
注意
:并不是一定要把本地分支往远程推送,具体哪些需要推送呢?
master
分支是主分支,因此要时刻与远程同步;dev
分时是开发分支,团队所有成员都需要再上面工作,所以也需要与远程同步;bug
分支只用于在本地修复bug,没必要推到远程,除非老板要看你每周修复几个bugfeature
分支是否推送到远程,取决于你是否和你的小伙伴合作在上面开发
抓取分支
如果现在远程有master
和dev
分支,从远程库clone时,只能看到本地的master
分支,如果要在dev分支上开发,就必须创建远程origin
的dev
分支到本地
$ git checkout -b dev origin/dev
然后就可以在dev
下开发了并push
了。
如果修改一段时间push失败,与别的小伙伴产生冲突,先用git pull
把最新的提交从origin/dev
抓下来,然后再本地合并,解决冲突,再推送:
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/<branch> dev
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,执行如下命令
$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
小结
多人协作的工作模式通常是这样:
首先,可以试图用git push origin <branch-name>推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,
用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
rebase
多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功,每次合并再push后,分支变成了这样
$ git log --graph --pretty=oneline --abbrev-commit
* d1be385 (HEAD -> master, origin/master) init hello
* e5e69f1 Merge branch 'dev'
|\
| * 57c53ab (origin/dev, dev) fix env conflict
| |\
| | * 7a5e5dd add env
| * | 7bd91f1 add new env
| |/
* | 12a631b merged bug fix 101
|\ \
| * | 4c805e2 fix bug 101
|/ /
* | e1e9c68 merge with no-ff
|\ \
| |/
| * f52c633 add merge
|/
* cf810e4 conflict fixed
总之看上去很乱。git提交历史能否变成一条干净的直线?
可以,git rebase
就可以做到
$ git rebase
First, rewinding head to replay your work on top of it...
Applying: add comment
Using index info to reconstruct a base tree...
M hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
Applying: add author
Using index info to reconstruct a base tree...
M hello.py
Falling back to patching base and 3-way merge...
Auto-merging hello.py
小结
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
5标签管理
发布一个版本时通常现在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本,标签是指向某个commit的指针。(跟分支很像,但是分支可以移动,标签不能移动),所以创建、删除标签都是瞬间完成的。tag是一个有意义的名字,容易记住,如v1.2,它跟某个commit绑在一起。
5.1创建标签
//1.切换到要打标签的分支上,如
$ git checkout master
//2.打标签命令 git tag <name>
$ git tag v1.0
//3.查看标签
$ git tag
//4.查看标签信息 git show <tagname>
$ git show v1.0
//5.创建带有说明的标签 用-a 指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
如果想要对历史提交打标签怎么办?
//1.查历史提交commit id
$ git log --pretty=oneline --abbrev-commit
12a631b (HEAD -> master, tag: v1.0, origin/master) merged bug fix 101
4c805e2 fix bug 101
e1e9c68 merge with no-ff
f52c633 add merge
cf810e4 conflict fixed
5dc6824 & simple
14096d0 AND simple
b17d20e branch test
d46f35e remove test.txt
b84166e add test.txt
519219b git tracks changes
e43a48b understand how stage works
1094adb append GPL
e475afc add distributed
eaadf4e wrote a readme file
//2.如果想对add merge这次提交打标签,它对应的commit id 是f52c633,
$ git tag v0.9 f52c633
小结
命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
命令git tag可以查看所有标签。
5.2操作标签
//1.删除标签(本地标签)
$ git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程
//推送标签到远程
$ git push origin v0.1
//一次性推送全部尚未推送的本地标签
$ git push origin --tags
删除远程标签,需要分两步,先删除本地再删除远程
$ git tag -d v0.9
//删除远程标签
$ git push origin :refs/tags/v0.9
是否真的从远程库删除了标签,可以登录github查看
小结
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签 - 命令
git tag -d <tagname>
可以删除一个本地标签 - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签