本文是Git教程 By 廖雪峰 的学习笔记
设置git用户名和邮件地址
运行如下命令在编辑器中编辑您的配置文件:
git config --global --edit
设置完毕后,您可以用下面的命令来修正本次提交所使用的用户身份:
git commit --amend --reset-author
创建版本库
mkdir learngit
cd learngit
git init
添加文件
vim readme.txt
Git is a version control system.
Git is free software.
git add readme.txt
git commit -m "注释"
修改文件
vim readme.txt
Git is a distributed version control system.
Git is free software.
git status #查看版本库的状态
git diff readme.txt #查看文件修改
git add readme.txt
git commit -m "注释"
查看日志
git log
commit f69bf8ce679fdf47b482a1534d98c348afe13f9f (HEAD -> master)
Author: zhaozhenwei
Date: Wed Oct 2 19:26:04 2019 +0800
append GPL
commit 677fe3c8298fa998ad81efaa48006b5b54d2bcd5
Author: zhaozhenwei
Date: Wed Oct 2 19:12:00 2019 +0800
remove distributed
commit 7e54e95b076620c445bdf20f6d9978a12a69ac58
Author: zhaozhenwei
Date: Wed Oct 2 19:10:26 2019 +0800
add distributed
commit 0f14bc33e5dc7279cd67bcc7601c64edf604b538
Author: zhaozhenwei
Date: Wed Oct 2 19:07:37 2019 +0800
write a readme file
git log --pretty=oneline #简单日志
f69bf8ce679fdf47b482a1534d98c348afe13f9f (HEAD -> master) append GPL
677fe3c8298fa998ad81efaa48006b5b54d2bcd5 remove distributed
7e54e95b076620c445bdf20f6d9978a12a69ac58 add distributed
0f14bc33e5dc7279cd67bcc7601c64edf604b538 write a readme file
版本
HEAD^ #上一个版本
HEAD^^ #上两个版本
HEAD~1 #上一个版本
HEAD~100 #上100个版本
版本回退
git reset --head HEAD ^
git reset --head HEAD~1
git reset --head f69bf8ce67 #回到指定版本
git reflog #记录提交的命令
f69bf8c (HEAD -> master) HEAD@{0}: reset: moving to f69bf8ce67
7e54e95 HEAD@{1}: reset: moving to HEAD^
677fe3c HEAD@{2}: reset: moving to HEAD~1
f69bf8c (HEAD -> master) HEAD@{3}: commit: append GPL
677fe3c HEAD@{4}: commit: remove distributed
7e54e95 HEAD@{5}: commit: add distributed
0f14bc3 HEAD@{6}: commit (initial): write a readme file
git reset --hard 677fe3c #根据前面的版本677fe3c进行版本回退
工作区与暂存区
git add filename #将文件添加到暂存区。
git commit #将暂存区内的文件提交到当前分支
git reset HEAD file 把暂存区的修改撤销掉(unstage),重新放回工作区。
git checkout -- readme.txt 丢弃工作区中的修改
删除文件
rm test.txt #删除本地文件
git rm test.txt #删除版本库文件
当本地文件删除之后,版本库中还存在时
git checkout -- test2.txt #用版本库中的版本替换工作区中的版本,无论工作区是修改还是删除,都可以“一键还原”。
远程仓库
1.可以自己搭建一个git服务器,24小时开机,工作人员从该“服务器”上克隆一份到自己的电脑上。
并把自己的提交推送到服务器仓库中。也可以从服务器仓库拉去别人的提交
2.通过GitHub充当git服务器
2.1 GitHub上注册账号
2.2 本地git仓库和GitHub服务器仓库之间的传输是通过ssh加密的。因此需要在本地用户主目录下创建
.ssh目录,同时又id_rsa(私钥)和id_rsa.pub(公钥)这两个文件。
ssh-keygen -t rsa -C "[email protected]"
2.3 登录GitHub,将本地ssh添加到GitHub中
2.4 添加远程仓库
如果本地没有Git仓库,则通过1进行创建并关联
如果本地已经有了Git仓库,则通过2进行关联
git push #将本地库推送到远程仓库中,第一次推送时,加上参数“u”,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地master分支与远程master分支关联,以后再进行推送时就可以简化命令: git push origin master
远程库克隆
1.登录GitHub,创建新的仓库:gitskills
2.从远程仓库进行克隆
git clone [email protected]:zzw19940201/gitskills.git #ssh格式
git clone https://github.com/zzw19940201/gitskills.git #http格式
3.克隆完成之后,可以在本地看到相关目录
4.克隆地址默认使用的是SSH协议,在使用HTTPS协议时,速度会很慢,每次推送都要输入口令
有些公司只开放了HTTPS协议,无法使用SSH协议,只能使用https协议。
分支管理
1.创建分支,并切换分支
git checkout -b dev
切换到一个新分支 'dev'
以上命令是以下两个命令的结合
git branch dev #创建分支
git checkout dev #切换分支
2.git branch #查看分支,git branch会列出所有分支,当前分支使用"*"标识
* dev
master
3.git merge dev #将制定分支合并到当前分支
4.git branch -d dev #删除指定分支
小结:
查看分支:git branch
创建分支:git branch branch_name
切换分支:git checkout branch_name
创建+切换分支:git checkout -b branch_name
合并分支:git merge branch_name
删除分支:git branch -d branch_name
解决冲突
1.打开冲突的文件
<<<<<<< HEAD
qqqqqqqqqqqqqqqqqqqqqq
=======
issssssssssssssssssssssssssss
>>>>>>> feature
2.将发生冲突的地方修改掉,修改方法和发生冲突的分支的提交人进行商议(怎么解决自己看着办)
qqqqqqqqqqqqqqqqqqqqqq
issssssssssssssssssssssssssss
3.将修改后的文件进行提交
git add fileName
git commit -m "注释"
命令总结
git checkout -b feature1 # 创建并切换分支
git checkout master # 切换分支
git merge feature1 # 将feature1内容合并到当前分支
git log --graph --pretty=oneline --abbrev-commit #查看分支情况
git branch -d feature1 # 删除分支feature1
git log --graph # 查看分支合并图
分支管理策略
1.git merge --no-ff -m "merge with no-ff" dev
--no-ff # 禁用Fast forward,提交时dev分支会是一个新的commit
# 普通模式合并,合并后的历史有分支,fast forward看不出曾经做过合并。
1.git stash # 将分支保存起来,可以恢复继续使用
2.git checkout master # 切换到要修改bug的分支
3.git checkout -b issue-101 # 创建修改bug的分支
4.git checkout master # 切换回要修改bug的分支
5.git merge --no-ff -m "merged bug fix 101" issue-101 #合并分支
6.git checkout dev # 切换回原来工作的分支
7.git stash list # 查看保存的分支
8.1. git stash apply # 恢复保存,stash内容不删除,
git stash drop # 删除保存的分支
8.2. git stash pop # 恢复保存的分支的同时,将保存的分支删除
8.3. git stash apply stash@{0} # 恢复指定的保存分支
强行删除分支
1.git branch -d feature-vulcan # 删除分支feature-vulcan,在该分支的内容未进行合并时,会报错,不允许删除
git branch -D feature-vulcan # 强行删除分支
多人协作
1.git remote # 查看远程库的信息
2.git remote -v # 显示更详细的信息
3.git push origin master # 将本地分支上的提交推送到远程库
git push origin dev
master是主分支,时刻与远程同步
dev是开发分支,团队所有成员要在上面协调工作,因此要与远程同步
bug分支用于本地修复bug,没有必要推送到远程
feature分支取决于是否在该分支上协同开发
4.git checkout -b dev origin/dev # 创建远程origin的dev分支到本地,记得去项目目录下
5.git add filename
git commit -m "注释" # 将dev分支上的提交推送到远程
6.git pull # 拉取最新的分支
7.git branch --set-upstream dev origin/dev # 设置本地分区和远程origin/dev分支的链接
总结:多人协作的工作模式
a.首先,通过git push origin branch_name 推送自己的修改
b.如果推送失败,那么远程分支比本地更新,先用git pull进行合并
c.如果合并有冲突,解决冲突,在本地进行提交
d.如果没有冲突或者冲突解决,在使用git push origin branch_name进行推送
本地新建的分支不推送到远程,他人不可见。
本地创建和远程分支对应的分支,git branch -b branch_name origin/branch_name,本地分支个远程分支最好一致
建立本地分支和远程分支的联系,git branch --set-upstream branch_name origin/branch_name
标签管理
1.标签,指向某个commit的指针
2.标签管理
2.1 切换到要打标签的分支
git checkout master
2.2 打标签
git tag v1.0
2.3 查看标签
git tag
2.4 默认标签是打在最新提交的commit上的,
如果想在历史提交的commit上打标签,找到历史提交的commit,打上标签即可
git log --pretty=oneline --abbrev-commit
git tag v0.9 6224937 # 6224937 提交时的版本号
2.5 标签不是按照时间顺序列出,而是按照字母序排序的。
可以通过git show tagName查看标签信息。
2.6 创建带有注释的标签
git tag -a v0.1 -m "注释" # -a:标签名 -m:注释
2.7 删除标签
git tag -d v0.1 # 删除本地标签
2.8 将标签推送到远程
git push origin tagname # 推送某个标签到远程
git push origin --tags # 推送所有未推送的标签到远程
2.9 删除远程
2.9.1 先删除本地分支
git tag -d v0.2
2.9.2 删除远程分支
git push origin :refs/tags/v0.9
3.0 总结
git push origin tagname # 见分支tagname推送到远程
git push origin --tags # 将所有未推送的标签推送到远程
git tag -d tagname # 删除指定标签
git push origin :refs/tags/tagname #删除远程标签