Git 命令

https://oschina.gitee.io/learn-git-branching/
https://git-scm.com/book/zh
https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C

pull 根据不同的配置,可等于 fetch + merge 或 fetch + rebase。具体了解可继续读下去。

要理解它们的区别,首先我们需要明白的git的架构,它是分布式的版本管理系统。我画了张图,不仅仅涉及到git fetch和git pull,对整体理解也会很有帮助。如下:

上图展示了git的整体架构,以及和各部分相关的主要命令。先说明下其中涉及的各部分。

工作区(working directory),简言之就是你工作的区域。对于git而言,就是的本地工作目录。工作区的内容会包含提交到暂存区和版本库(当前提交点)的内容,同时也包含自己的修改内容。

暂存区(stage area, 又称为索引区index),是git中一个非常重要的概念。是我们把修改提交版本库前的一个过渡阶段。查看GIT自带帮助手册的时候,通常以index来表示暂存区。在工作目录下有一个.git的目录,里面有个index文件,存储着关于暂存区的内容。git add命令将工作区内容添加到暂存区。

本地仓库(local repository),版本控制系统的仓库,存在于本地。当执行git commit命令后,会将暂存区内容提交到仓库之中。在工作区下面有.git的目录,这个目录下的内容不属于工作区,里面便是仓库的数据信息,暂存区相关内容也在其中。这里也可以使用merge或rebase将远程仓库副本合并到本地仓库。图中的只有merge,注意这里也可以使用rebase。

远程版本库(remote repository),与本地仓库概念基本一致,不同之处在于一个存在远程,可用于远程协作,一个却是存在于本地。通过push/pull可实现本地与远程的交互;

远程仓库副本,可以理解为存在于本地的远程仓库缓存。如需更新,可通过git fetch/pull命令获取远程仓库内容。使用fech获取时,并未合并到本地仓库,此时可使用git merge实现远程仓库副本与本地仓库的合并。git pull 根据配置的不同,可为git fetch + git merge 或 git fetch + git rebase。rebase和merge的区别可以自己去网上找些资料了解下。


Commands

git  help  xx_command
git  xx_command  --help 

git   --version                            查看git版本

git config --global user.name  "xxx_name"       全局级别的签名设置,全局的放在本用
git config --global user.email "xxx@gmail.com"  户的家目录下的.gitconfig文件中

git config user.name "xxx_name"            项目级别的签名设置,放在工作仓库的.git/config里面
git config user.email "xxxxx@gmail.com"    项目级别的签名设置,放在工作仓库的.git/config里面

git config --list                        查看配置
git config --global --list               查看全局配置
git config --global --edit               编辑全局配置



git init                                 初始化本地仓库,会在当前目录下创建一个.git的目录

git status                               查看仓库当前状态
git status  -uno                         查看仓库当前状态,忽略未跟踪的文件

git add  [file name]                     本地写好的文件放到暂存区域
  git add .                              等于 git add -A 或者 git add --all
  git add 这个命令处理后面可以增加 pathname,也可以增加参数
  git add 默认不加参数,表示他会监控工作区的状态,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
  git add -u(--update),仅添加已经被git跟踪的文件(tracked file),会将修改(文件内容修改和文件删除)的文件提交到暂存区。git add -u 不会提交新文件(untracked file)。
  git add --all(-A, --no-ignore-removal),是上面两个的合集,即会把修改的文件加到暂存区,也会把新建的文件加到暂存区,同时还会把已经工作区删除了的文件从暂存区删除掉。

git restore
    git restore --staged                 将暂存区的文件从暂存区撤出,但不会更改文件文件的内容。
    git restore xxx                      撤销在工作空间但是不在暂存区的文件更改,如恢复工作区删除的文件xxx


git rm --cached <file>...                删除暂存区域的文件,和本地区域没关系

git commit  [file name]                  把暂存区域内容,维护到本地仓库
    git commit -a
    git commit -m "commit message" [file name]    不进入到文本模式,进行更改记录的添加
    git commit --message="commmint message log" [file name]
    git commit --amend                   修正上次的提交,可以使用上一次的提交信息,也可以对上次提交的内容进行修改。
                                         git commit -m "xxx" 提交之后,发现-m的说明文字写的有问题,想要重新写提交信息,
                                         或者又修改了某些文件,利用上次的提交信息并作部分修改,这个时候可以用命令 
        	                         git commit --amend  -m "xxx"  覆盖上一次的提交信息进行commit提交,
                                         且上次的提交信息不会出现在提交 git log中
    git commit -s -m XXX                 在git log 的时候会多展示 signed-off-by  行
    git commit -a -m XXX                 相当于先git add .  再git commit -m  XXX


git log                                  查看版本的更新日志,使用空格一屏一屏的切换
    git log --stat                           查看提交记录,显示文件列表改动,不包括内容改动
    git log -n                               n表示只显示最近n次的记录
    git log --pretty=oneline                 每次提交显示一行(全hash值)
    git log --oneline                        每次提交显示一行(哈希值的前7位)
    git reflog                               HEAD@{x}中x表示从当前版本回退到某个版本HEAD指针要移动的次数
    git log --oneline --decorate --graph --all   图像化的方式显示出分支创建后的版本迭代过程
    git log --oneline --graph
    git log --oneline -n --graph             n表示只显示最近n次的记录
    git log -- filename(git log filename)    可以看到该文件相关的commit记录
    git log -p filename                      可以显示该文件每次提交的diff
    log一页显示不全,英文状态下按Q退出git log 命令,按空格或者回车显示下面的信息


git reset    
--hard                            
  git reset --hard                       查看当前HEAD指向的版本
  git reset --hard  xxxxxxx              基于索引值(哈希值),xxxxxxx就是哈希值的前几位
  git reset --hard  HEAD^                基于^符号,只能向老版本回滚,不能向新版本回滚。
                                         向后回滚一个版本,HEAD后面的就一个^;向后回滚2个,在HEAD后面就使用两个^^
  git reset --hard  HEAD~n               基于~符号。只能向后回滚,回滚版本数n。
  git reset -–hard origin/master         回退到与远程master代码一样
--hard这个参数在一定情况下会有一定的危险。比如在工作区内容没提交工本地库之前,使用了--hard命令把本地库的内容重置到工作区和暂存区,会导致工作区更改的内容丢失。

git reset --mixed
git reset --soft


git branch\ git checkout
    git branch   分支名xx                     创建分支xx
    git checkout 分支名xx                     切换到分支xx
    git checkout -b 分支名xx                  基于当前分支(commit)创建并切换到分支xx
    git checkout -b 分支名xx commit_id        基于commit_id创建并切换到分支xx
    git checkout commit_id                    基于commit_id切到临时分支,可用于实验性修改
    git branch -d xx                          删除分支xx
    git branch -D xx                          强制删除分支xx
    git branch                                列出当前分支清单,列出所有分支
    git branch -a                             查看远程分支和本地分支
    git branch -r                             查看远程的分支名
    git branch -v                             查看各个分支最后一个提交信息
    git branch --merged                       查看哪些分支已经合并入当前分支


git merge 要合并的(from)分支名称       要先切换到接受修改的(to)分支上,由接受修改的分支来执行merge合并命令

git commit -m "commit msg"                分支冲突解决后,提交不能有文件名


git remote -v                             查看当前的远程仓库连接
git remote add origin URL                 为远程库取个别名,叫origin

git push
  git push <远程主机名> <本地分支名>  <远程分支名>    
     如 git  push  origin  master:refs/for/master   将本地的master分支推送到远程主机origin上的对应master分支, 
                                                    origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。
  git push origin master             如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
  git push -u origin master          如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
  git push origin               如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支 
  git push                      如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名


git clone
    git clone URL           1完整的把远程库下载到本地  2创建origin远程库别名  3初始化本地库
    git clone -b 分支名  仓库地址  存放路径    克隆指定的分支到本地目录,然后在该目录下push时,对应的就是push到远端的对应分支。
    git clone --recursive URL     递归克隆项目下面的所有git项目



git fetch [远程库别名] [远程库分支]     将远程主机的内容拉到本地,不合并
git merge [远程库别名/远程库分支]       本地合并远程库内容
当然上面这两步可以用一个操作 git pull 来统一完成

git pull
    git pull 命令的作用是:将远程主机的内容拉下来后直接合并,即:git pull = git fetch + git merge,可能会产生冲突,需要手动解决。它的完整格式稍稍有点复杂。

    git pull [<options>] [<repository> [<refspec>…​]]
    git pull  <远程主机名>   <远程分支名>:<本地分支名>
        比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样:
    git pull origin next:master
        如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为:
    git pull origin next

        什么时候使用  git pull [远程主机名] [远程分支名] [本地分支名]  ?
        修改比较简单,确定不会产生合并冲突的时候。

        什么时候使用git fetch [远程主机名] [远程分子名],git merge [远程库名/远程分支名] [本地分支]
        远程仓库的修改可能和本地仓库产生冲突的时候,可以先把远程仓库的放到本地。经过对比之类后,再进行合并(也要解决冲突)。


git rm
  如果是对所有文件都取消跟踪的话,就是
  git rm -r --cached .   //不删除本地文件
  git rm -r --f .        //删除本地文件

 
  对某个文件取消跟踪
  git rm --cached readme1.txt    删除readme1.txt的跟踪,并保留在本地。
  git rm --f readme1.txt         删除readme1.txt的跟踪,并且删除本地文件。
  当需要删除暂存区或分支上的文件, 但本地又需要使用, 只是不希望这个文件被版本控制, 
    可以使用 git rm --cached xxx
  git rm --cached 会从index里面删除该文件,下次commit的时候会修改git仓库,
    但是本地的文件还是保留


git blame                        显示文件的每一行最后修改的版本和作者
    用法:git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--      incremental] [-L n,m]  [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>]  [<rev> | --contents <file> | --reverse <rev>] [--] <file>
    例如,git blame -L 100,120   xx.c

git diff
    git diff    //比较工作区与暂存的(git add 后)的差别,一个文件可以在commit之前多次add
    git diff --cached || --staged          //比较暂存区文件 与上一次commit 的差别
    git diff branch1 branch2 --stat        //显示出所有有差异的文件列表
    git diff branch1 branch2 具体文件路径   //显示指定文件的详细差异
    git diff branch1 branch2               //显示出所有有差异的文件的详细差异

在工作区新建一个文件apple.txt,然后把这个文件加入到暂存区。接着文件不小心从工作区删除了,本地库也没有apple.txt。如何让从暂存区恢复数据到工作区。

现在有两种情况,要还是不要apple.txt
  不要了,撤销暂存区的修改。

        git reset HEAD apple.txt

  要,即把工作区的修改(删除也算修改的一种)撤销。

       git restore apple.txt  或者
       git checkout -- apple.txt       


强制拉取覆盖本地仓库

尝试:

先撤销本地的所有要放弃的修改,git restore . ,然后git pull。

----------------------------------------------------------------------------------------

    git fetch --all
    git reset --hard origin/master  
    git pull
使用远程master分支覆盖本地。使用其它分支,则更改第二条命令的参数master。

git diff old mode 解决办法

git diff 显示

git diff xxx
old mode 100644
new mode 100755
是文件权限改变了引起的,解决办法也很简单,只需要设置 git 忽略本地文件的权限价差

方法1,当前项目设置
git config core.filemode false
方法2,git 全局设置
git config --global core.filemode false

git merge简洁用法

一、开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支

git checkout dev
git pull
// do something

git checkout master
git merge dev
git push -u origin master

二、当master代码改动了,需要更新开发分支(dev)上的代码

git checkout master 
git pull
git checkout dev
git merge master 
git push -u origin dev

git stash

常用git stash命令:

(1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

(2)git stash list  :查看stash了哪些存储

(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p

(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} 

(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储

(8)git stash clear删除所有缓存的stash

git pull 拉代码的时候,或者切换分支的时候,防止冲突和不便,会用到git stash,将工作区内容暂存起来。
git stash 可用来暂存当前正在进行的工作, 比如想 pull 最新代码, 又不想加新commit;
或者另外一种情况,为了fix 一个紧急的bug, 先stash, 使返回到自己上一个commit, 改完bug之后再stash pop, 继续原来的工作。

基础命令:
$git stash
$do some work, such as git pull
$git stash pop

为什么我们需要它, git stash和git stash pop
给大家说一下我使用这个命令的场景:
此时我在 feature_666 分支专注地实现一个功能 666 模块,
这时,客户反馈出一个 bug , 非常严重,必须立马解决,
于是,需要去到 release 分支去 checkout 新的分支去工作,但是 666 功能还没完成怎么办? 
此时我面临着一个选择题: 
A:提交后切换,代码保存到分支 feature_666,却产生一个无意义的提交 
B:不提交直接切换,然而这个选项根本没人会选。是不是很难选,此时,别忘记还有 C 选项!
C:使用 git stash , 将当前修改(未提交的代码)存入缓存区,切换分支修改 bug ,回来再通过 git stash pop 取出来。

----------------------------------------------------------------------------------------
使用git stash命令保存和恢复进度
git stash
保存当前工作进度,会把暂存区和工作区的改动保存起来。执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。使用git stash save 'message...'可以添加一些注释
git stash list
显示保存进度的列表。也就意味着,git stash命令可以多次执行。
git stash pop [–index] [stash_id]
git stash pop 恢复最新的进度到工作区。git默认会把工作区和暂存区的改动都恢复到工作区。
git stash pop --index 恢复最新的进度到工作区和暂存区。(尝试将原来暂存区的改动还恢复到暂存区)
git stash pop stash@{1}恢复指定的进度到工作区。stash_id是通过git stash list命令得到的 
通过git stash pop命令恢复进度后,会删除当前进度。
git stash apply [–index] [stash_id]
除了不删除恢复的进度之外,其余和git stash pop 命令一样。
git stash drop [stash_id]
删除一个存储的进度。如果不指定stash_id,则默认删除最新的存储进度。
git stash clear
删除所有存储的进度。

需要注意的是,冲突解决之后,Git并不会删除之前的stash记录,可以使用git stash drop将没用的记录删除掉。 


在落后的dev分支上进行了部分开发,同步master分支,继续开发

git stash
git checkout master
git pull
//process conflict if exists
git checkout dev_branch
git merage master
git stash pop
//develop
git add  xxx
git commit -m "xxxx"
git push
//merage request

新建分支推送到远程

git branch new_br
git checkout new_br
(git checkout -b new_br)

// do something
git push  // will fail, fatal: The current branch tmp has no upstream branch.

git push --set-upstream origin new_br

git restore

git restore --stage <file>和git restore <file>两个命令,总结如下:

1、文件在暂存区且未作修改的情况

使用git restore --staged <file> 把文件从暂存区移动到工作区,即文件不被追踪;

2、文件在暂存区且已经修改的情况

使用git restore --staged <file> 把文件从暂存区移动到工作区,且不会撤销修改的内容;

使用git restore <file> 文件仍在暂存区且会撤销文件修改的内容;

3、文件在本地代码库已经修改的情况

使用git add <file> 把文件重新放到暂存区,且保留文件的修改;

使用git restore <file> 文件仍在本地代码库且会撤销文件的修改;

对于git restore <file>命令,会撤销文件的修改,使文件恢复到暂存区或本地代码库(取决于文件在修改前的状态);

对于git restore --staged <file>命令,把文件从暂存区撤回到工作区,保留文件最后一次修改的内容;

git reset 三种模式

三种模式,soft,mixed,hard,具体的使用方法下面这张图,展示的很全面了。

git各个区域和命令关系

这三个模式理解了,对于使用这个命令很有帮助。在理解这三个模式之前,需要略微知道一点Git的基本流程。正如上图,Git会有三个区域:

  • Working Tree 当前的工作区域
  • Index/Stage 暂存区域,和git stash命令暂存的地方不一样。使用git add xx,就可以将xx添加近Stage里面
  • Repository 提交的历史,即使用git commit提交后的结果

reset三种模式区别

区别:

  1. --hard:重置位置的同时,直接将 working Tree工作目录index 暂存区repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。

  2. --soft:重置位置的同时,保留working Tree工作目录index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。

  3. --mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。

git clean

用来从工作目录中删除所有没有tracked过的文件

git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的<commit>的状态

git clean -n

        是一次clean的演习, 告诉你哪些文件会被删除. 记住他不会真正的删除文件, 只是一个提醒

git clean -f

        删除当前目录下所有没有track过的文件. 他不会删除.gitignore文件里面指定的文件夹和文件, 不管这些文件有没有被track过

git clean -f <path>

        删除指定路径下的没有被track过的文件

git clean -df

        删除当前目录下没有被track过的文件和文件夹

git clean -xf

        删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件

git reset --hard和git clean -f是一对好基友. 结合使用他们能让你的工作目录完全回退到最近一次commit的时候

git clean对于刚编译过的项目也非常有用. 如, 他能轻易删除掉编译后生成的.o和.exe等文件. 这个在打包要发布一个release的时候非常有用

git merge 单一文件

两个分支A、B

想要合并A的某个文件file.txt至分支B,如果使用git merge命令,会将整个A分支都合并到B

如果只想合并某一个文件,应该使用git checkout -p(--patch)

git checkout B

git checkout -p A file.txt

注:分支A可以是远程的分支,也可以是本地分支,远程分支应该写origin/A,如果只写A则默认是本地分支。

如果在开发过程中经常使用git fetch + git merge命令合并master分支的代码到develop分支,那么本地的master分支是不会merge的,这点要格外注意,这时想要合并远程的某一个文件就要加origin。

只拉取某个分支
 

本地拉取过仓库,远程仓库有人推送了新的分支dev以及其他分支,想只拉取dev分支

git fetch origin dev 命令来把远程分支拉到本地

然后使用:git checkout -b dev origin/dev   在本地创建分支dev并切换到该分支

最后使用:git pull origin dev   就可以把某个分支上的内容都拉取到本地了

git show

查看commit提交记录详情

git show                查看最新的commit的所有修改

git show commitId                        查看指定commit hashID 的所有修改

git show commitId -- fileName     查看某次commit中具体某个文件的修改

git show --name-only commitId       查看某次commit中改动的文件

git show --name-only commitId | grep xxx

去除git diff 时出现的 ^M

 git config --global core.whitespace cr-at-eol 

git cherry-pick

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。

这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。

git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。

$ git cherry-pick <commitHash>

上面命令就会将指定的提交commitHash,应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。

举例来说,代码仓库有MasterFeature两个分支。


    a - b - c - d   Master
         \
           e - f - g Feature

现在将Feature分支的提交f应用到master分支。


# 切换到 master 分支
$ git checkout master

# Cherry pick 操作
$ git cherry-pick f

上面的操作完成以后,代码库就变成了下面的样子。


    a - b - c - d - f   Master
         \
           e - f - g Feature

从上面可以看到,master分支的末尾增加了一个提交f

git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交。


$ git cherry-pick feature

上面代码表示将feature分支的最近一次提交,转移到当前分支。

Cherry pick 支持一次转移多个提交。


$ git cherry-pick <HashA> <HashB>

上面的命令将 A 和 B 两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。

如果想要转移一系列的连续提交,可以使用下面的简便语法。


$ git cherry-pick A..B 

上面的命令可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

注意,使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用下面的语法。


$ git cherry-pick A^..B 

git cherry-pick命令的常用配置项如下。

(1)-e--edit

打开外部编辑器,编辑提交信息。

(2)-n--no-commit

只更新工作区和暂存区,不产生新的提交。

(3)-x

在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。

(4)-s--signoff

在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。

如果操作过程中发生代码冲突,Cherry pick 会停下来,让用户决定如何继续操作。

(1)--continue

用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。


$ git cherry-pick --continue

(2)--abort

发生代码冲突后,放弃合并,回到操作前的样子。

(3)--quit

发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。


修改分支名称

需要将分支 br_rename_old 修改为 br_rename_new,执行如下步骤:
1、执行命令  git   checkout br_rename_old   切换到br_rename_old分支,如果已经在这个分支下,可以不执行此步骤
2、执行命令 git pull origin  br_rename_old    将代码更新到和远程仓库一致
3、执行命令 git branch -m br_rename_old   br_rename_new   将本地仓库的br_rename_old的名称修改为br_rename_new
4、执行命令 git push --set-upstream origin   br_rename_new    将本地分支push到远程仓库
5、执行命令 git push origin --delete   br_rename_old     将远程分支br_rename_old删除


删除分支

1、利用“git branch --delete xx_branch”命令删除本地分支; --delete   或者用  -d

2、利用“git push origin --delete xx_branch”命令删除远程分支

-d   和  -D

  • -d是--delete的缩写,在使用--delete删除分支时,该分支必须完全和它的上游分支merge完成(了解上游分支,可以点击查看链接),如果没有上游分支,必须要和HEAD完全merge

  • -D是--delete --force的缩写,这样写可以在不检查merge状态的情况下删除分支

git worktree

git worktree方案可以概括为:创建共享版本仓库的多个工作区

$ gt worktree
usage: git worktree add [<options>] <path> [<commit-ish>]
   or: git worktree list [<options>]
   or: git worktree lock [<options>] <path>
   or: git worktree move <worktree> <new-path>
   or: git worktree prune [<options>]
   or: git worktree remove [<options>] <worktree>
   or: git worktree unlock <path>