1-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^ 撤销。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二流人物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值