总结 Git 版本管理 - 命令
代码提交删除及版本回退
-
git add readme.txt添加修改的文件,把文件修改添加到暂存区
-
git commit -m "append GPL"提交修改的文件
-m后接提交log,是把暂存区的所有内容提交到当前分支
如果不用git add到暂存区,那就不会加入到commit -
git log、git log --pretty=oneline查看历史记录
-
HEAD当前版本,
HEAD^上个版本,HEAD^^上上个版本,HEAD~100往上100个版本 -
git reset --hard HEAD^回退到上一个版本
-
git reset --hard 1094a回退到指定版本,
1094a指定版本的ID -
git reflog记录每一次命令
-
git diff HEAD -- 要查看的文件.m查看工作区和版本库里面最新版本的区别:
-
git checkout -- 要修改的文件.xx可以丢弃工作区的修改,让这个文件回到最近一次
git commit或git add时的状态
要修改的文件.xx自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
要修改的文件.xx已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。前提是有被添加到版本库
-
git reset HEAD 暂存区要撤销的文件.xx把暂存区的修改撤销掉(unstage),重新放回工作区
执行完该命令后,暂存区是干净的,工作区有修改,如果需要丢弃工作区的修改,参考第9点
又到了小结时间。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退,不过前提是没有推送到远程库。
-
rm test.txt、git rm在文件中删除或者命令删除时,需要从版本库中删除该文件,删除后需要提交
git commit
远程仓库
-
创建
SSH Key
本地git仓库和github仓库之间的传输是通过ssh加密的,所以需要先创建SSH Hey,在用户主目录下查看有没有.ssh,如果有检查有没有id_rsa和id_rsa.pub这两个文件,如果有了,则可以跳过,没有则创建ssh-keygen -t rsa -C "youremail@example.com"
登录
GitHub,打开账号设置SSH Keys页面
添加SSH Key,粘贴id_rsa.pub文件的内容
添加远程仓库
先有本地库,后有远程库,如何关联远程库

- 本地Git仓库、GitHub创建仓库,保持同步
登录
GitHub找到
Create a new repo按钮,创建新仓库在
Repository name处填入仓库名称(方便后面使用用learngit代替),点击创建,成功的创建一个新的Git仓库-
learngit新建的仓库为空仓库,可以从改仓库克隆出新的仓库,也可把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到GitHub仓库,在本地learngit仓库下运行命令git remote add origin git@github.com:youGitHubAccountName/learngit.git
* 添加成功后远程库的名字就是origin -
把本地库的所有内容推送到远程库上
git push -u origin master
* 把本地库的内容推送到远程,实际上是把当前分支master推送到远程,由于远程库是空的,在第一次推送master分支时加上-u参数,git会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来。
> git push 推送成功后可以在
GitHub页面中看到远程库的内容已经和本地一样了-
本地更改提交
git push origin master
-
小结:
- 关联一个远程库
git remote add origin git@server-name:path/repo-name.git;
- 关联后第一次推送master分支的所有内容
git push -u origin master
- 每次本地提交后,推送最新修改
git push origin master
从远程库克隆
先创建远程库,然后从远程库克隆

- 登录
GitHub,创建新仓库,名字叫(以实际项目名字命名)gitsKills - 勾选initialize this repository with a README,会自动创建一个
README.md文件 - 用命令克隆一个本地库
git clone(确定本地仓库的路径在输入命令)git clone 创建的仓库地址.git
- 小结
需要先知道仓库地址,然后使用git clone命令克隆
分支管理
创建与合并
-
创建
dev分支,然后切换到dev分支git checkout -b dev
-b表示创建并切换相当于两条语句
git branch dev
git checkout dev git branch查看当前分支,当前分支前面会有一个*号-
dev分支的工作完成即commit后,就可以切回master分支git checkout master
-
dev上的工作成果合并到master分支上git merge dev
用于合并指定分支到当前分支(经过第3步的操作后,该出即将dev合并到master上) -
合并完成后删除
dev分支git branch -d dev
-
小结
建议使用分支完成某个任务,合并后再删掉该分支
- 查看分支:
git branch - 创建分支:
git branch branchName - 切换分支:
git checkout branchName - 创建+切换分支:
git checkout -b branchName - 合并某分支到当前分支:
git merge branchName - 删除分支:
git branch -d branchName
- 查看分支:
解决冲突
使用git status也可以告诉我们冲突的文件
找到对应的冲突文件后,手动解决冲突,
重新添加commit
用 git log --graph --pretty==oneline --abbrev-commit查看分支合并情况
分支管理策略
-
master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活; - 干活都在
dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
通常Git会用Fast forward模式,这种模式下删除分支,会丢掉分支信息。
如果强制禁用Fast forward模式,Git会在merge时生成一个新的commit,这样从分支历史上就可以看出分支信息。
-
创建并切换
dev分支git checkout -b dev
git add readme.txt
git commit -m "add merge" -
切回master
git checkout master
-
准合并
dev分支,--no-ff参数为禁用Fast forwardgit merge --no-ff -m "merge with no-ff" dev
因为--no-ff会创建一个新的commit,所以加上-m参数,把commit描述写进去 -
合并后用
git log查看分支历史git log --graph --pretty=oneline --abbrev-commit
bug分支
stash,可以把当前工作现场储藏(暂存)起来,等以后恢复现场后继续工作
-
git stash暂存工作区内容 -
git stash list查看工作区的内容 -
git stash apply、git stash drop恢复工作去的内容并删除stash里的内容 -
git stash pop恢复工作去的内容并删除stash的内容
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除,
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场
Feature分支
多功能开发
一个功能对应一个feature分支
- git branch -d feature-vulcan 删除一个分支
- git branch -D feature-vulcan 强行删除一个分支
多人协作
-
推送分支,把该分支推送到远程仓库
git push origin 要推送的分支名 master为主分支,因此要时刻远程同步dev分支是开发分支,所以也需要与远程保存同步bug分支只用于本地修复bug,就没必要推送到远程了feature分支是否推送到远程取决与是否合作开发
抓取分支
- 先用
git pull把最新的提交从origin/dev上抓取下来,然后在本地合并,解决冲突,在推送 -
git pull失败,原因是没有指定本地dev分支与远程分支的链接根据提示可设置后再pullgit branch --set-upstream-to=origin/dev dev
- 多人协作的工作模式:
首先试图用
git push origin branchName推送自己的修改推送失败,因为远程分支比你的本地更新,需要先
git pull合并合并如有冲突则解决冲突,并在本地提交
在用
git push origin branchName推送-
本地分支和远程分支创建链接关系
git branch --set-upstream-to branchName origin/branchName
Rebase
变基
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
标签管理
创建标签:
-
git branch切到需要打标签的分支上 -
git tag v1.0打一个新的标签 -
git tag查看所有标签 标签是按字母排序的,不是按时间顺序列出的 -
git log --pretty=oneline --abbrev-commit查找commit id -
git tag v0.9 commit id指定提交的地方打标签 -
git tag show v0.9查看标签信息 -
git tag -a v0.1 -m “version 0.1 released” 1094adb,-a指定标签名,-m指定说明文字 -
git tag -d v0.1删除本地标签 -
git push origin <tagname>推送到远端 -
git push origin --tags推送全部标签到远端 -
git push origin :refs/tags/v0.9,删除远程标签,已经推送到远端的删除需要先删除本地的标签,然后在删除远端的
常用命令
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 remote -v显示本地所有的远程仓库地址git remote remove origin/upstream删除本地代码与远端GitLab分支之间的关系git remote add origin git@gitlab.go-goal.cn:albert/xxx-bottom.git本地代码与新的GitLab服务器关联起来git remote add upstream git@gitlab.go-goal.cn:albert/xxx-bottom.git本地代码与新的GitLab服务器关联起来git pull线上线下分支同步git pull upstream线上线下分支同步git push origin --all将本地的所有分支都推送到新的GitLab服务器远程分支git stash暂存工作区内容git stash list查看工作区的内容git stash apply、git stash drop恢复工作去的内容并删除stash里的内容git stash pop恢复工作去的内容并删除stash的内容-
git log --graph --pretty==oneline --abbrev-commit查看分支合并情况
-
git status查看当前仓库的状态
-
git diff查看difference修改内容
-
git add 、git commit添加需要提交的文件,然后commit
mkdir learngit创建一个空目录cd learngit切换到该目录下pwd查看该目录路径git initls -ah查看.git的目录,.git用来跟踪管理版本库的cat ~/.ssh/id_rsa.pub查看ssh是否是自己的(与git管理台自己账户设置中对应)-
移除之前的仓库对应关系
git remote remove origin
git remote remove upstream -
创建新的自己的仓库,在建立主仓库upstream
git remote add origin 地址xxx
git remote add upstream http://远端地址.git (输入要要远程连接的主仓库) -
再拉取本地仓库的分支和upstream分支
git pull upstream
多需求开发时,有未完成的任务,又需要切换分支的情况:
先暂存,然后切换分支,处理完后切回,然后找回暂存内容,继续开发
-
git stash暂存工作区内容 -
git stash list查看工作区的内容 -
git stash apply、git stash drop恢复工作去的内容并删除stash里的内容 -
git stash pop恢复工作去的内容并删除stash的内容
参考:Git教程
https://www.liaoxuefeng.com/wiki/896043488029600/896954848507552
Git Document
https://git-scm.com/book/zh/v2
Git cheat sheet
https://gitee.com/liaoxuefeng/learn-java/raw/master/teach/git-cheatsheet.pdf