Git 工作流程
使用 Git 来共同开发
从一个程序员角度来看看复仇者联盟这个故事,有必要重新安排以下故事背景:
公司:神盾局股份有限公司
项目:智能终端安全防护
产品:复仇者联盟安全应用
职员:
姓名 | 职务 |
---|---|
尼克弗瑞 | 公司领导 |
托尼·斯塔克 | 高级开发工程师、Git 远程仓库管理员 |
史蒂夫·罗杰斯 | 高级开发工程师 |
托尔 | 高级开发工程师 |
贮藏库:Git 远程仓库服务
工作内容:
神盾局股份有限公司接到了一个项目,该项目要求为智能中终端开发一款安全防护应用,该应用必须可以有效抵御“灭霸”病毒的侵袭;据悉“灭霸”病毒预计可以删除智能终端的所有文件。公司的领导尼克弗瑞批准了该项目,并指定托尼·斯塔克、史蒂夫·罗杰斯和托尔共同完成这个项目。项目的工作架构如下图所示:
项目进展:
-
由于托尼·斯塔克、史蒂夫·罗杰斯和托尔目前并不在一起,为了方便团队协作,托尼·斯塔克接到任务后在公司总部斯塔克大厦的 make 中心服务中创建了一个新的 Git 版本库,命名为 avengers。
tony@make-server:~$ mkdir -p /src/git tony@make-server:~$ cd /src/git tony@make-server:/src/git$ git init --bare avengers.git
-
史蒂夫·罗杰斯接收到版本库已经就绪的消息后,就首先开始编写代码的工作。因为史蒂夫·罗杰斯在本项目中首次使用 Git,所以他需要获取自己的版本库实例:
rogers@captain-america:~$ git clone https://git.make.com/avengers rogers@captain-america:~$ cd avengers rogers@captain-america:~/avengers$
由于这是新建的一个版本库,所以没有任何代码。罗杰斯于是开始编码,很快他实现了一个 shield 的方法,这个方法的可以抵御“灭霸”病毒入侵个人终端,罗杰斯成功的运行了该程序。
-
史蒂夫·罗杰斯发布修改。
# 将文件添加到版本库中 rogers@captain-america:~/avengers$ git add avengers.c # 查看仓库当前状态 rogers@captain-america:~/avengers$ git status -s A avenger.c # 向仓库提交代码 rogers@captain-america:~/avengers$ git commit -a -m "Initial implementation" # 发布修改(提交到服务器) rogers@captain-america:~/avengers$ git push
-
托尔经过深思熟虑,想到有一种方法可以快速的杀灭“灭霸”病毒,于是托尔开始编码。在这之前他需要建立专属他自己的版本库实例:
thor@hammer:~$ git clone https://git.make.com/avengers
克隆版本库后,托尔查看目录发现已经有了代码实现,所以他决定浏览一遍代码,然后他将自己的想法实现为一个 lightning 的方法,该方法可以与 shield 方法配合使用,有效阻挡和杀死“灭霸”病毒。测试完成后,托尔提交变更:
# 查看仓库当前状态 thor@hammer:~/avengers$ git status -s M avenger.c # 比较文件,确认对代码的修改 thor@hammer:~/avengers$ git diff # 提交代码到仓库 thor@hammer:~/avengers$ git commit -a -m "Add lightning" # 发布修到服务 thor@hammer:~/avengers$ git push
-
托尼·斯塔克在得知罗杰斯和托尔的进展后,决定看一看效果。
tony@iron-man:~$ git clone https://git.make.com/avengers
获取版本后,托尼迫不及待进行了编译和运行测试,前几次的测试效果还是比较理想的,但是很快托尼发现“灭霸”病毒也在不断的演进,现在的 avengers 程序在一些情况下可能会被“灭霸”破防,导致终端设备丢失一半的数据。于是托尼写了一个 infinity_gauntlet 的方法,该方法可以彻底清除终端设备的“灭霸”病毒并恢复被删除或锁定的数据。此时 avengers.c 的代码大致是这样的:
#include <stdio.h> void shield() { ... } void lightning() { ... } void infinity_gauntlet() { ... } int main(int argc, char *argv[]) { shield(); lightning(); nfinity_gauntlet(); return 0; }
经过多次测试后,托尼准备提交代码到仓库。但考虑到项目的结构和管理,托尼将 avengers.c 移动到 “src/” 目录下,并为项目建立了一个 Makefile 文件和一个 README 文件:
tony@iron-man:~/avengers$ mkdir src tony@iron-man:~/avengers$ git mv avengers.c ./src tony@iron-man:~/avengers$ git status -s R avengers.c —> src/avengers.c tony@iron-man:~/avengers$ git commit -a -m "Add infinity_gauntlet and directory structure" # 配置Git始终执行重命名和拷贝的检测 tony@iron-man:~/avengers$ git config --global diff.rename copies tony@iron-man:~/avengers$ git add Makefile README tony@iron-man:~/avengers$ git status -s # 托尼将avengers.c改名为avge.c,并同时修改了Makefile文件 tony@iron-man:~/avengers$ git mv src/avengers.c src/avge.c tony@iron-man:~/avengers$ git status -s tony@iron-man:~/avengers$ git diff ...... tony@iron-man:~/avengers$ git commit -a -m "Add and modify files"
在进行了这些操作后,托尼打算将这些变更推送到服务端:
tony@iron-man:~/avengers$ git push
但是,由于此前罗杰斯已经推送了一些内容到 master 分支上,Git 系统现在不允许托尼推送他对项目代码的变更。所以托尼只能先将服务端版本库的内容与自己的版本库同步:
# 执行pull命令后,Git系统会将服务端版本库中的变更下载到托尼本机,然后自动将他们和托尼本机的变更合并,最后把合并的变更提交到本机版本库中 tony@iron-man:~/avengers$ git pull tony@iron-man:~/avengers$ git show
代码合并后,为了保证质量,需要再进行编译测试。若没有问题,就可以把合并后的代码推送到服务器:
tony@iron-man:~/avengers$ git push
-
创建标签。托尼、罗杰斯和托尔经过商议后一致决定项目可以进行大范围的发布了,所以托尼创建了一个标签:
tony@iron-man:~/avengers$ git tag -a -m "avengers v0.1" v0.1 tony@iron-man:~/avengers$ git tag --list v0.1 # 将标签推送到服务端 tony@iron-man:~/avengers$ git push origin tag v0.1
此时罗杰斯和托尔为了获得这个标签,需要更新他们的版本库:
rogers@captain-america:~/avengers$ git pull
thor@hammer:~/avengers$ git pull
-
罗杰斯觉的将 avengers 的 shield、lightning、infinity_gauntlet 统一封装成一个单独的子程序是一个好注意,像这样:
#include <stdio.h> void avengers() { // shield ... // lightning ... // infinity_gauntlet ... } int main(int argc, char *argv[]) { avengers(); return 0; }
编译测试后提交变更:
rogers@captain-america:~/avengers$ git status -s rogers@captain-america:~/avengers$ git commit -a -m "Abstract"
同时,托尔发现 lightning方法中,还可以进行适当优化:
#include <stdio.h> void lightning() { // lightning // hammer // storm_tomahawk }
之后托尔测试并提交了更新:
thor@hammer:~/avengers$ git status -s thor@hammer:~/avengers$ git diff thor@hammer:~/avengers$ git commit -a -m "Optimize" thor@hammer:~/avengers$ git push
当罗杰斯推送他的变更时
git push
,Git 服务器拒绝了他。罗杰斯需要从服务端的版本库上下载最新版本项目文件,然后手动把自己的变更和托尔的变更合并:# 更新代码,尝试自动合并 thor@hammer:~/avengers$ git pull # 自动合并失败,手动合并,然后查看不同 thor@hammer:~/avengers$ git diff thor@hammer:~/avengers$ git status -s thor@hammer:~/avengers$ git commit -a -m "Merge:avengers" thor@hammer:~/avengers$ git push
至此,罗杰斯成功合并了冲突,并提交了变更。
-
托尼·斯塔克打算为项目添加一个版权声明文件 COPYRIGHT。他在操作中误实用了
git add -v
命令,把工作区中的所有文件都添加到了版本库中,其中就包括一个 TEST 文件,它只是一个临时文件,不需要存储在仓库中,所以需要删除该文件:tony@iron-man:~/avengers$ git pull tony@iron-man:~/avengers$ git add -v ... tony@iron-man:~/avengers$ git status -s A COPYRIGHT A TEST tony@iron-man:~/avengers$ git rm -f TEST ... tony@iron-man:~/avengers$ git status -s A COPYRIGHT tony@iron-man:~/avengers$ git commit -a -m "Add COPYRIGHT"
-
为了提升代码的可读性,托尼·斯塔克调整了 avge.c 的代码缩进格式:
tony@iron-man:~/avengers$ indent src/avge.c
然后他使用
git diff -stat
统计了文件源码的变更记录,发现调整的变更太多了,为了防止可能出现的问题,托尼觉的撤销对 avge.c 格式的修改:tony@iron-man:~/avengers$ git status -s M src/avge.c tony@iron-man:~/avengers$ git checkout --src/rand.c tony@iron-man:~/avengers$ git status -s
-
罗杰斯意识到此时程序只能对类“灭霸”的病毒有有效抵挡和杀灭作用。他打算做一些升级,以使得 avengers 可以抵挡更多种类病毒的袭击。他决定在自己的版本库中创建一个新分支:
# 首先需要更新本地的代码为最新 rogers@captain-america:~/avengers$ git pull # 创建并切换到新分支 rogers@captain-america:~/avengers$ git checkout -b better-avengers
在新分支中,罗杰斯对avengers方法进行了优化,然后提交了代码变更并推送到了服务器:
rogers@captain-america:~/avengers$ git commit -a -m "Better" rogers@captain-america:~/avengers$ git push --set-upstream origin better-avengers
与此同时,托尼打算推送自己给项目添加的 COPYRIGHT 文件变更,但是由于新分支的出现,推送肯定是失败的。于是托尼从服务端获取Alice创建的新分支,然后合并到自己版本库的默认分支下:
rogers@captain-america:~/avengers$ git merge origin/better-avengers
若要撤销合并,可以执行:
rogers@captain-america:~/avengers$ git reset --hard @{1}
Git 工作流程总结
Git 的一般工作流程如下:
- 通过克隆 Git 资源创建工作目录
- 在工作目录中添加或修改文件
- 如果它人修改了远程资源文件,本地可以更新资源
- 查看修改并准备提交修改
- 提交修改
- 提交修改后若发现错误,可以撤销提交,然后重新修改后再次提交
实操演示
创建 Git 项目
这里使用 GitLab 创建一个 avengers 的工程。
安装 Git
按照 Git 官网方法,再你的设备上按照 Git。这里使用的是 Windows 系统:
λ git --version
git version 2.28.0.windows.1
Git 全局设置
λ git config --global user.name "tony"
λ git config --global user.email "tony@ftsafe.com"
创建仓库
前面我们在 GitLab 创建了一个 avengers 工程,这一步将该工程克隆到本地:
E:\GitCode
λ git clone http://192.168.0.9/tony/avengers.git
Cloning into 'avengers'...
warning: You appear to have cloned an empty repository.
E:\GitCode
λ ls
avengers/
E:\GitCode
λ cd avengers\
E:\GitCode\avengers (master -> origin)
λ ls -a
./ ../ .git/
很显然,我们克隆的是一个空仓库。
创建并添加文件
我们在 avengers 目录下创建一个 avengers.c 的文件,文件内容为一个简单的小程序。然后我们尝试将该文件添加到版本库。
E:\GitCode\avengers (master -> origin)
λ ls
avengers.c
# git add
E:\GitCode\avengers (master -> origin)
λ git add avengers.c
# git commit
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Add avengers.c"
[master (root-commit) 53656b6] Add avengers.c
1 file changed, 7 insertions(+)
create mode 100644 avengers.c
# git push
E:\GitCode\avengers (master -> origin)
λ git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 152.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To http://192.168.0.9/tony/avengers.git
* [new branch] master -> master
注意:
在执行
git push
的时候,你可能需要输入 GitLab 的账号和密码,如果提前配置了 SSH,可以省略这个步骤。
此时,在 GitLab 管理中心可以看到已经上传的文件:
自动合并冲突
现在,我们在 E:\GitCode\avengers
目录下又创建了 README 、Makefile 两个文件和一个 src
目录,然后把 avengers.c 移动到 src
目录下,并重命名为 avge.c,然后再avge.c 中添加了一些新的内容。
E:\GitCode\avengers (master -> origin)
λ ls
avengers.c Makefile README src/
E:\GitCode\avengers (master -> origin)
λ git mv avengers.c src\
E:\GitCode\avengers (master -> origin)
λ git status -s
R avengers.c -> src/avengers.c
?? Makefile
?? README
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Directory structure"
[master 6aa2f74] Directory structure
1 file changed, 0 insertions(+), 0 deletions(-)
rename avengers.c => src/avengers.c (100%)
E:\GitCode\avengers (master -> origin)
λ git config --global diff.renames copies
E:\GitCode\avengers (master -> origin)
λ git add README Makefile
E:\GitCode\avengers (master -> origin)
λ git status -s
A Makefile
A README
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Add README and Makefile"
[master 8e99b93] Add README and Makefile
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Makefile
create mode 100644 README
E:\GitCode\avengers (master -> origin)
λ git status -s
R src/avengers.c -> src/avge.c
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Rename"
[master 064cdc2] Rename
1 file changed, 0 insertions(+), 0 deletions(-)
rename src/{avengers.c => avge.c} (100%)
然后,尝试使用 git push
将变更推送到服务端(在次之前,有其他的开发者修改了 GitLab 服务端的 avengers.c 文件)。
E:\GitCode\avengers (master -> origin)
λ git push
To http://192.168.0.9/tony/avengers.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'http://192.168.0.9/tony/avengers.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
显然推送失败了,根据提示信息我们知道远程服务器和本地存在冲突,我们需要使用 pull
命令来同步:
E:\GitCode\avengers (master -> origin)
λ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 347 bytes | 2.00 KiB/s, done.
From http://192.168.0.9/tony/avengers
bc1766c..c695803 master -> origin/master
Merge made by the 'recursive' strategy.
src/avge.c | 1 +
1 file changed, 1 insertion(+)
现在自动合并冲突完成了:
E:\GitCode\avengers (master -> origin)
λ git show
commit 8e91f1f51030183a7a05b6ffdf58ab7e01b45705 (HEAD -> master)
Merge: 064cdc2 c695803
Author: fengguodong <tony@ftsafe.com>
Date: Thu Jun 3 15:59:27 2021 +0800
Merge branch 'master' of http://192.168.0.9/tony/avengers into master
E:\GitCode\avengers (master -> origin)
λ git push
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (11/11), 1012 bytes | 144.00 KiB/s, done.
Total 11 (delta 2), reused 0 (delta 0), pack-reused 0
To http://192.168.0.9/fengguodong/avengers.git
c695803..8e91f1f master -> master
此时 GitLab 管理中心的可以看到合并后的代码:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HMdqUL72-1626320408804)(.\res\git-image-11-auto merge.png)]
手动合并冲突
现在我们在本地修改了 avge.c 文件,增加了一些方法。同时其他的开发人员也修改了 avge.c 文件,并推送到了服务端。
E:\GitCode\avengers (master -> origin)
λ git status -s
M src/avge.c
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Modify avge.c"
[master a272630] Modify avge.c
1 file changed, 14 insertions(+)
E:\GitCode\avengers (master -> origin)
λ git push
To http://192.168.0.9/tony/avengers.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'http://192.168.0.9/tony/avengers.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
不出所料,推送失败了,那么按照前面的经验执行 pull
命令:
E:\GitCode\avengers (master -> origin)
λ git pull
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 432 bytes | 2.00 KiB/s, done.
From http://192.168.0.9/tony/avengers
8e91f1f..37174ba master -> origin/master
Auto-merging src/avge.c
CONFLICT (content): Merge conflict in src/avge.c
Automatic merge failed; fix conflicts and then commit the result.
自动合并没法顺利进行,让我们来查看一下差异:
E:\GitCode\avengers (master -> origin)
λ git status -s
UU src/avge.c
E:\GitCode\avengers (master -> origin)
λ git diff
diff --cc src/avge.c
index c509d5f,8eb232f..0000000
--- a/src/avge.c
+++ b/src/avge.c
@@@ -1,22 -1,16 +1,33 @@@
#include <stdio.h>
#include <stdlib.h>
++<<<<<<< HEAD
+void shield()
+{
+ printf("shield.\n");
+}
+
+void lightning()
+{
+ printf("lightning.\n");
++=======
+ void infinity_gauntlet()
+ {
+ printf("infinity_gauntlet.\n");
++>>>>>>> 37174bacc386e110fb0e8adbb594a4d03fa03af2
}
int main(int argc, char *argv[])
{
printf("Avengers application.\n");
++<<<<<<< HEAD
+ shield();
+ lightning();
+
++=======
+ infinity_gauntlet();
+
++>>>>>>> 37174bacc386e110fb0e8adbb594a4d03fa03af2
return 0;
}
我们打开本地 avge.c 文件:
#include <stdio.h>
#include <stdlib.h>
<<<<<<< HEAD
void shield()
{
printf("shield.\n");
}
void lightning()
{
printf("lightning.\n");
=======
void infinity_gauntlet()
{
printf("infinity_gauntlet.\n");
>>>>>>> 37174bacc386e110fb0e8adbb594a4d03fa03af2
}
int main(int argc, char *argv[])
{
printf("Avengers application.\n");
<<<<<<< HEAD
shield();
lightning();
=======
infinity_gauntlet();
>>>>>>> 37174bacc386e110fb0e8adbb594a4d03fa03af2
return 0;
}
可以发现 Git 自动以
<<<<<<< HEAD
、=======
和>>>>>>> 37174bacc386e110fb0e8adbb594a4d03fa03af2
分隔了冲突的代码。
接下来,进行手动合并:
#include <stdio.h>
#include <stdlib.h>
void shield()
{
printf("shield.\n");
}
void lightning()
{
printf("lightning.\n");
}
void infinity_gauntlet()
{
printf("infinity_gauntlet.\n");
}
int main(int argc, char *argv[])
{
printf("Avengers application.\n");
shield();
lightning();
infinity_gauntlet();
return 0;
}
解决合并后重新提交上传:
E:\GitCode\avengers (master -> origin)
λ git status -s
UU src/avge.c
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Manual merge"
[master e9ff32d] Manual merge
E:\GitCode\avengers (master -> origin)
λ git push
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 777 bytes | 155.00 KiB/s, done.
Total 8 (delta 3), reused 0 (delta 0), pack-reused 0
To http://192.168.0.9/tony/avengers.git
37174ba..e9ff32d master -> master
此时 GitLab 管理中心的可以看到合并后的代码。
创建标签
E:\GitCode\avengers (master -> origin)
λ git tag -a -m "avenges v0.1" v0.1
E:\GitCode\avengers (master -> origin)
λ git tag --list
v0.1
E:\GitCode\avengers (master -> origin)
λ git log -1 --decorate --abbrev-commit
commit e9ff32d (HEAD -> master, tag: v0.1, origin/master, origin/HEAD)
Merge: a272630 37174ba
Author: tony <tony@ftsafe.com>
Date: Thu Jun 3 16:32:01 2021 +0800
Manual merge
E:\GitCode\avengers (master -> origin)
λ git push origin tag v0.1
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 159 bytes | 159.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To http://192.168.0.9/fengguodong/avengers.git
* [new tag] v0.1 -> v0.1
创建分支
# 列出所有分支
E:\GitCode\avengers (master -> origin)
λ git branch
* master
# 创建分支
E:\GitCode\avengers (master -> origin)
λ git branch dark-avengers
E:\GitCode\avengers (master -> origin)
λ git branch
dark-avengers
* master
# 切换分支
E:\GitCode\avengers (master -> origin)
λ git checkout dark-avengers
Switched to branch 'dark-avengers'
# 创建和切换分支可以一块执行
# git checkout -b dark-avengers
E:\GitCode\avengers (dark-avengers -> origin)
λ git branch
* dark-avengers
master
切换分支后,我们在 avge.c 中做一些修改,比如增加一个方法。然后尝试向服务推送:
E:\GitCode\avengers (dark-avengers -> origin)
λ git diff
diff --git a/src/avge.c b/src/avge.c
index 0bb2cad..8e285aa 100644
--- a/src/avge.c
+++ b/src/avge.c
@@ -16,6 +16,11 @@ void infinity_gauntlet()
printf("infinity_gauntlet.\n");
}
+void dark()
+{
+ printf("dark.\n");
+}
+
int main(int argc, char *argv[])
{
printf("Avengers application.\n");
@@ -23,6 +28,7 @@ int main(int argc, char *argv[])
shield();
lightning();
infinity_gauntlet();
+ dark();
return 0;
}
\ No newline at end of file
E:\GitCode\avengers (dark-avengers -> origin)
λ git commit -a -m "Add dark"
[dark-avengers af674aa] Add dark
1 file changed, 6 insertions(+)
E:\GitCode\avengers (dark-avengers -> origin)
λ git push
fatal: The current branch dark-avengers has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dark-avengers
可以发现由于服务端没有 dark-avengers 分支,我们需要使用 git push --set-upstream origin dark-avengers
进行推送:
E:\GitCode\avengers (dark-avengers -> origin)
λ git push --set-upstream origin dark-avengers
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 364 bytes | 182.00 KiB/s, done.
Total 4 (delta 2), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for dark-avengers, visit:
remote: http://192.168.0.9/fengguodong/avengers/-/merge_requests/new?merge_request%5Bsource_branch%5D=dark-avengers
remote:
To http://192.168.0.9/fengguodong/avengers.git
* [new branch] dark-avengers -> dark-avengers
Branch 'dark-avengers' set up to track remote branch 'dark-avengers' from 'origin'.
合并分支
将 dark-avengers 分支合并到 avengers 分支:
E:\GitCode\avengers (dark-avengers -> origin)
λ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
E:\GitCode\avengers (master -> origin)
λ git branch
dark-avengers
* master
E:\GitCode\avengers (master -> origin)
λ git merge dark-avengers
Updating e9ff32d..af674aa
Fast-forward
src/avge.c | 6 ++++++
1 file changed, 6 insertions(+)
E:\GitCode\avengers (master -> origin)
λ git commit -a -m "Merge branches"
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
E:\GitCode\avengers (master -> origin)
λ git push
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To http://192.168.0.9/fengguodong/avengers.git
e9ff32d..af674aa master -> master
合并分支后如有冲突,也需要手动处理。
删除分支
E:\GitCode\avengers (master -> origin)
λ git branch -d dark-avengers
Deleted branch dark-avengers (was af674aa).
E:\GitCode\avengers (master -> origin)
λ git branch
* master
撤销合并
对应没有发布的合并可以使用 git reset --hard @{1}
或 git reset --hard HEAD^
撤销。