Git 命令简介
总结 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
文件的内容
添加远程仓库
先有本地库,后有远程库,如何关联远程库
个人远端仓库 origin.png- 本地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 forward
git 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
分支与远程分支的链接根据提示可设置后再pull
git 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 init
-
ls -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