两张图理解工作区、暂存区和版本库并总结git常用命令
前情提要
学了很多 git 命令,还有就是工作区、暂存区和版本库,这三个搞来搞去有点懵逼,自己总结了一下,做的图有些简陋,如果有不对的地方,烦请大佬们指出。
一、版本管理
1. 一张图总结
2. 版本管理常用命令
# 创建版本库
git init
# 版本创建
git add
git commit -m "版本说明信息"
# 查看版本记录
git log
# 版本回溯,HEAD^指向当前版本的前一版本
git reset --hard HEAD^
# 查看操作记录
git reflog
# 提交修改
git add # 把工作区的修改放入暂存区
git add -u # 只add已经追踪过的文件
git commit -m "修改信息" # 把暂存区的修改做一次版本记录
# 撤销修改,撤销 add 和 commit 操作
1. 撤销工作区的修改
git checkout -- <file>
2. 撤销已经add到暂存区,但未commit的修改
git reset HEAD <file>
+
# git checkout -- <file> # 注意,这会将工作区的修改也撤销,如果不希望撤销工作区的修改则不必使用
3. 已经commit,版本回退至前一版本
# 1.git reset --soft 版本号
# 不删除工作区改动的代码,撤销commit,不撤销git add .
git reset --soft HEAD^ //回到上一个版本
# 2.git reset --mixed 版本号
# 不删除工作区改动的代码,撤销commit,撤销git add .
git reset --mixed HEAD^ //回到上一个版本
# 3.git reset --hard 版本号
# 删除工作区的代码,撤销commit,撤销git add . 回到上一次commit的状态
git reset --hard HEAD^ # 慎用此命令,因为会将工作区的文件也一并修改掉
二、分支管理
1. 一张图总结
2. git 常用分支命名
Production分支(主线分支用于发版,不会直接改)
Master分支,这个分支只能从其他分支合并,不能在这个分支直接修改
Develop分支(开发分支)
这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature分支
Feature分支(新功能分支)
这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release
Release分支(偏向测试)
当你需要一个发布一个新Release的时候,我们基于Develop分支创建一个Release分支,完成Release后,我们合并到Master和Develop分支
Hotfix分支(紧急bug发布)
当我们在Production发现新的Bug时候,我们需要创建一个Hotfix, 完成Hotfix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release
3. git branch 和 git checkout
# 查看帮助
git branch -h # 终端中输出帮助
git branch --help # 打开git帮助文档
# 查看remotes/origin下的分支
git branch -r
git ls-remote origin # 会显示最新的 commit ID
# 查看所有分支,包括heads下和remotes/origin下的
git branch -a
# 切换分支
git checkout <分支名>
# 新建分支,默认以当前分支为基础
git branch <新分支名>
# 新建并切换分支
git checkout -b <新分支名>
# 删除分支,删除的是heads下的分支test
git branch -d test
# 删除remotes/origin下的分支test,并提交到远端(即删除远端的test)
git branch -rd origin/test
git push origin --delete test # push会同时删除remotes/origin和远端的test
# 提交分支:push分支test到remotes/origin和远端的new_test
git push origin test:new_test
# 重命名分支,重命名的是heads下的分支
git branch -m old_name new_name
# 删除所有名字以 temp 开头的分支(多加两个空格是因为 git branch 输出结果带有空格)
git branch | grep -E "^ temp" | xargs git branch -d
git branch | grep -E "^ temp" | xargs git branch -D # 强制删除
# 强制删除 master 和当前分支以外的所有分支
git branch | grep -Ev "master" | xargs git branch -D
三、拉取与提交命令
1. git merge
merge
默认会将分支与 当前分支 合并。当前分支指的是 HEAD
指向的分支,该分支的指向可以在
# 将origin/master与当前分支合并
git merge origin/master
# 将hotfix分支与当前分支合并,hotfix默认搜索heads/
git merge hotfix
git diff hotfix # 查看hotfix与当前分支的不同
# 出现冲突,解决过程
git status -s # UU 表示出现冲突的文件
vim conflict.* # 先修改出现冲突的文件
git add . # add 告诉git冲突已经解决
git status -s # M 表示冲突已经解决
git commit -m "conflict" # 提交解决冲突后的新版本
2. git fetch
fetch
默认只将远端更新到remotes/origin,不会更新heads。
# 将远端更新到remotes/origin,不会更新heads
git fetch
git diff HEAD FETCH_HEAD
# 获取远端的分支,即同步远端的dev分支到 remotes/origin/dev 和 heads/temp
git fetch origin dev:temp
3. git pull
pull
相当于 fetch
和merge
,会更新到 当前分支。
# 默认拉取的是与远端HEAD指向的分支,同时合并到本地HEAD指向的当前分支
git pull
# 拉取远端dev分支到本地,并合并到当前分支
git pull origin dev = git fetch origin + git merge origin/dev
# 拉取本地不存在的远端分支
git pull origin dev:dev
4. git push
push
会同时影响 remotes/origin 和远端。远端不存在push的分支时,会创建它。
# 提交当前分支到远端,如果当前分支HEAD指向的master,就提交本地master到远端master。
git push
# 提交本地的master到远端的master,远端master不存在时会被创建。本地master不存在则会报错。
git push origin master
# 提交分支:push分支master到remotes/origin和远端的master_r
git push origin master:master_r
# push会同时删除remotes/origin和远端的test
git push origin --delete test
5. git diff
diff
可以查看分支内容的改动。
# git diff <local branch> <remote>/<remote branch>
# 显示本地 master 分支和 远程 master 分支文件改动的摘要
git diff --stat master origin/master
操作记录:
# 对比工作区和版本库文件的不同
[root@i hellogit]# git diff HEAD -- code.py
diff --git a/code.py b/code.py
index 8ebeb35..61ef177 100644
--- a/code.py # -代表版本库
+++ b/code.py # +代表工作区
@@ -1 +1,2 @@
1. This is a code py
+2. This for git add and git checkout -- file # 出现+号,说明工作区比HEAD版本多了一行
# 对比两个版本库文件的不同
[root@i hellogit]# git diff HEAD HEAD^ -- code.py
diff --git a/code.py b/code.py
index 61ef177..8ebeb35 100644
--- a/code.py # -代表当前版本
+++ b/code.py # +代表后一个版本
@@ -1,2 +1 @@
1. This is a code py
-2. This for git add and git checkout -- file # 当前版本比后一个版本多一行
[root@i hellogit]# git diff HEAD^ HEAD -- code.py
diff --git a/code.py b/code.py
index 8ebeb35..61ef177 100644
--- a/code.py # -代表后一个版本
+++ b/code.py # +代表当前版本
@@ -1 +1,2 @@
1. This is a code py
+2. This for git add and git checkout -- file # 当前版本比后一个版本多一行