精华内容
下载资源
问答
  • 1. 撤销本地分支的上一次git commit:   git reset --hard HEAD 2. 撤销本地分支的n次commit提交: git reset HEAD~n 3. git reset --hard/--mixed/--soft 的区别参考:...


    1. 撤销本地分支的上一次git commit: 

       git reset --hard HEAD


    2. 撤销本地分支的n次commit提交:

    git reset HEAD~n

    3. git reset  --hard/--mixed/--soft  的区别参考:

    https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-%E4%BB%A3%E7%A0%81%E5%9B%9E%E6%BB%9A%EF%BC%9AReset%E3%80%81Checkout%E3%80%81Revert%E7%9A%84%E9%80%89%E6%8B%A9





    展开全文
  • git commitgit push、git pull、 git fetch、git merge 的含义与区别 git commit:是将本地修改过的文件提交到本地库中; git push:是将本地库中的最新信息发送给远程库; git pull:是从远程获取最新版本到本地...

    git commit、git push、git pull、 git fetch、git merge 的含义与区别

    git commit:是将本地修改过的文件提交到本地库中;
    git push:是将本地库中的最新信息发送给远程库;
    git pull:是从远程获取最新版本到本地,并自动merge;
    git fetch:是从远程获取最新版本到本地,不会自动merge;
    git merge:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;
    $ git merge -b // 指将 b 分支合并到当前分支
    git pull 相当于 git fetch + git merge。

    git 基本操作注意点总结:

    git clone
    复制本地仓库的命令方式。

    :想克隆的本地仓库路径

    :想克隆去另一个地方的路径。例如 git clone d:/git e:/git11 是将 d:/git 的仓库(即包含隐藏文件 .git 的目录)克隆到 e:/git11 目录下。

    注意:

    1、 目录必须没有在文件系统上创建,或创建了但里面为空,不然会克隆不成功。

    2、与从远程拉取仓库不同,路径的最后不用写 .git 来表明这是一个仓库。

    git status –s
    获得简短的状态输出。

    git diff
    git diff:查看工作区与暂存区的不同。
    git diff –cached []:查看暂存区与指定提交版本的不同,版本可缺省(为HEAD)。
    git diff :查看工作区与指定提交版本的不同。
    git diff …:查看2个指定提交版本的不同,其中任一可缺省(为HEAD)。
    git diff …:查看2个不同分支指定提交版本的不同,其中任一可缺省(为HEAD),该命令相当于git diff $(git-merge-base A B) B。
    git commit –am “”
    直接提交全部修改,相当于 add 和 commit 一起执行了。

    注意:全部文件为 tracked 才行,你新建了文件为 untracked 时,该命令不会执行。

    git checkout
    与 git reset 不同,reset 是替换整个目录树,多余的文件将被删除。而 checkout 只是替换指定的文件,对多余的文件保留不做任何处理。

    git rm
    把文件从工作区和暂存区中删除。使用 —cached 只从暂存区中删除。使用 –rf 可删除指定目录下的所有文件和子目录。

    git mv
    在工作区和暂存区中进行移动或重命名。若 不为一个目录名,则执行重命名。如果为一个目录名,则执行移动。

    展开全文
  • Git快速入门系列文章 ... - Git快速入门-git stash 暂存变更,git reset 撤销commitgit revert 回退远程版本库 注:本文基于git version 2.13.5 版本进行演示 1. 概述 Git入门系列第四篇,基于场...

    Git快速入门系列文章
    - Git快速入门-安装配置篇
    - Git快速入门-常用命令之独奏篇
    - Git快速入门-常用命令之交响乐篇
    - Git快速入门-git stash 暂存变更,git reset 撤销commit,git revert 回退远程版本库

    注:本文基于git version 2.13.5 版本进行演示

    1. 概述

    Git入门系列第四篇,基于场景,介绍一些非常实用的Git命令,也许这些命令会让你产生“还有这种操作”的感叹。例如如何把修改暂存起来,留着以后使用?想撤销已提交(commit)到本地版本库的代码该怎么办?撤销已push到远程代码库的代码呢?

    2. 如何把修改暂存起来,留着以后使用?

    2.1 使用场景

    实际开发过程中,我们经常会遇到这样的问题,当我们想把远程仓库的最新代码拉下来时,发现git会提示说我们本地做的修改会被覆盖,建议先commit代码或者stash(暂存)代码。你一定遇到过类似下面这样的提示:

    $ git pull origin master
    remote: Counting objects: 4, done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 4 (delta 1), reused 3 (delta 1), pack-reused 0
    Unpacking objects: 100% (4/4), done.
    From github.com:flysqrlboy/git-command-tutorials
     * branch            master     -> FETCH_HEAD
       7dd2e09..d7e1e19  master     -> origin/master
    Updating 7dd2e09..d7e1e19
    error: Your local changes to the following files would be overwritten by merge:
        b.txt
    Please commit your changes or stash them before you merge.
    Aborting

    留意下面两句提示,我们可以有两个选择:commit或stash。

    error: Your local changes to the following files would be overwritten by merge:
    b.txt
    Please commit your changes or stash them before you merge.

    如果我们本地的代码修改得差不多了,可以选择commit到本地版本库。但如果我们的修改只是个半成品,我们不想把这样的代码留在提交历史里的话。git stash就能派上用场了。

    2.2 git stash 暂存进度

    先来看下当前的工作区和暂存区状态:

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   b.txt

    git status 输出中告诉我们,a.txt 和 b.txt 都有修改,a.txt 已加入到暂存区(在Changes to be committed下面),b.txt 的修改则还在工作区中(在Changes not staged for commit下面)。正是因为远程代码库有人更改了b.txt ,才导致本地拉取代码时提示会被覆盖。这里,用git stash 命令保存当前工作进度。

    $ git stash
    Saved working directory and index state WIP on master: 7dd2e09 add two files a.txt b.txt

    运行git stash 之后,再查看工作区状态,会发现之前工作区和暂存区的修改都不见了。

    $ git status
    On branch master
    nothing to commit, working tree clean

    2.3 查看进度

    查看stash进度用命令git stash list

    $ git stash list
    stash@{0}: WIP on master: 7dd2e09 add two files a.txt b.txt

    可以看到刚刚暂存的进度有个标识 stash@{0}。如果想查看某个进度具体修改的文件可以用命令git stash show

    $ git stash show stash@{0}
     a.txt | 1 +
     b.txt | 1 +
     2 files changed, 2 insertions(+)

    2.4 恢复进度

    使用 git stash pop 从最近保存的进度进行恢复。

    $ git stash pop
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
    modified:   a.txt
    modified:   b.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")
    Dropped refs/stash@{0} (ddc97ea74d33f3417f5ddab429a1dfeb3c08ca19)

    通过git status查看工作区状态,可以看到之前的修改又回来了。

    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   a.txt
        modified:   b.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")

    不过可能你也发现了一个小瑕疵,原来的a.txt 的修改已经添加到暂存区的,但现在用git stash pop 恢复进度后,a.txt 的修改却还在工作区,暂存区的修改被撤销了。这里其实可以在运行git stash pop命令时带上一个 –index 的选项来告诉git重新应用被暂存的变更。

    git stash pop --index
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   b.txt
    
    Dropped refs/stash@{0} (c62afccafe9aaec2b44abe85b4206728479b9902)
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   b.txt

    3. 如何撤销工作区的修改?

    如果觉得对b.txt这个文件的修改是没有必要的,该如何撤消修改,回到之前的状态(也就是回到没有修改前的状态)?git status 命令输出是有告诉我们怎么做的:

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   b.txt

    就在“Changes not staged for commit”下面第二个括号内,

    (use “git checkout – < file >…” to discard changes in working directory)

    git checkout – filename 可以丢弃某个文件在工作区的改动。我们试试看。

    $ git checkout -- b.txt
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt

    git status 已经没有b.txt 的信息,说明b.txt的修改已经撤出工作区,恢复到修改前的版本了。这里提醒一下:git checkout – filename 这个命令是有点危险的,因为它会丢弃掉之前做的改动,这是找不回来的。只有在确定某个文件是真的不需要改动才撤销。一般情况下,如果只是想回到没修改前的版本,但仍然想保留修改的内容,可以用git stash命令把改动暂存起来。

    4. 如何把暂存区的修改撤回到工作区

    如果我们不小心把一些还不想提交的修改添加到了暂存区(例如不小心用了 git add . 命令把所有改动都add 到暂存区),我们怎么把某些文件撤回工作区呢?实际上git status命令也有告诉我们。

    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
    
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   b.txt

    在 “Changes to be committed” 下面,

    (use “git reset HEAD < file >…” to unstage)

    用 git reset HEAD filename 命令把暂存区的改动撤回到工作区,我们试试。

    $ git reset HEAD a.txt
    Unstaged changes after reset:
    M   a.txt
    M   b.txt
    
    $ git status
    On branch master
    Changes not staged for commit:
      (use "git add <file>..." to update what will be committed)
      (use "git checkout -- <file>..." to discard changes in working directory)
    
        modified:   a.txt
        modified:   b.txt
    
    no changes added to commit (use "git add" and/or "git commit -a")

    git status 输出可以看到,a.txt 的改动已经被撤出暂存区了。

    5. 如何把最近的一次commit撤回到暂存区

    如果我们对最近的一次commit感到不满意,想把它从本地版本库撤回到暂存区,该怎么做呢?让我们先做一次commit:

    git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
        modified:   b.txt
    
    $ git commit -m 'modify a.txt b.txt'
    [master c80c16c] modify a.txt b.txt
     2 files changed, 2 insertions(+)
    
    $ git log --oneline
    c80c16c (HEAD -> master) modify a.txt b.txt
    7dd2e09 add two files a.txt b.txt
    e6e0035 1.oneline 2.second line

    提交已经成功,commitid 为 c80c16c 。现在要撤销这次提交,把改动撤回到暂存区。同样是使用命令 git reset,只不过这次要加上 –soft 选项。

    $ git reset --soft HEAD^
    $ git status
    On branch master
    Changes to be committed:
      (use "git reset HEAD <file>..." to unstage)
    
        modified:   a.txt
        modified:   b.txt

    git status 输出告诉我们,a.txt 和 b.txt的改动又回到暂存区了。再查看提交历史。

    $ git log --oneline
    7dd2e09 (HEAD -> master) add two files a.txt b.txt
    e6e0035 1.oneline 2.second line

    commitid 为 c80c16c 的那次提交已经没有了。现在来解释下 git reset –soft HEAD^ 的含义。先说一下”HEAD^”,它代表最新的一次提交的前一次提交。“HEAD”在Git中就是一个引用,它总是指向(当前分支中)最新的那一次提交。所以上面的命令意思是把头部引用(HEAD)向前回退一次。而选项–soft 的作用就是把最新那次提交的所有改动撤回到暂存区。

    6. 如何回退已经push到远程版本库的提交

    上面我们讨论的只是撤销本地做的提交,那如果提交已经push到远程代码库。要怎么回退呢?我们先把上面对a.txt , b.txt的修改push到远程代码库。

    $ git push origin master
    Counting objects: 4, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (4/4), 373 bytes | 373.00 KiB/s, done.
    Total 4 (delta 0), reused 0 (delta 0)
    To github.com:flysqrlboy/git-command-tutorials.git
       d7e1e19..f0e0628  master -> master

    已push成功,看下提交历史

    $ git log --oneline
    f0e0628 (HEAD -> master, origin/master) modify a.txt b.txt
    d7e1e19 Merge pull request #1 from imflysquirrel/master
    0c550df modify b.txt by imflysquirrel
    7dd2e09 add two files a.txt b.txt

    commitid 为 f0e0628的这次提交已经push到远程。现在想回退远程的这次提交,可能你会想到,先在本地用git reset命令撤销f0e0628 ,再push到远程,这种方案可行吗?试试看:

    $ git reset --soft HEAD^
    $ git log --oneline
    d7e1e19 (HEAD -> master) Merge pull request #1 from imflysquirrel/master
    0c550df modify b.txt by imflysquirrel
    7dd2e09 add two files a.txt b.txt

    执行git reset后本地已经回退到上一次提交,这时我们使用git push推送到远程看看能否成功。

    $ git push origin master
    To github.com:flysqrlboy/git-command-tutorials.git
     ! [rejected]        master -> master (non-fast-forward)
    error: failed to push some refs to 'git@github.com:flysqrlboy/git-command-tutorials.git'
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart. Integrate the remote changes (e.g.
    hint: 'git pull ...') before pushing again.
    hint: See the 'Note about fast-forwards' in 'git push --help' for details.

    推送失败了,reject的原因是说本地当前分支落后于远程代码库,如下

    hint: Updates were rejected because the tip of your current branch is behind

    因为我们本地的HEAD引用当前指向的提交是 d7e1e19,而远程的HEAD指向的是f0e0628。d7e1e19落后于f0e0628。其实不应该用git reset来回退远程仓库的提交,取而代之的是用git revert。git revert 这个命令也会创建一次提交,只不过这个提交相当于被回退的那次提交的一个反向提交。比如在f0e0628 这次提交提交中,b.txt增加了一行“Hello World!”,git diff 如下

    diff --git a/b.txt b/b.txt
    index 696ac20..0f47c73 100644
    --- a/b.txt
    +++ b/b.txt
    @@ -1 +1,2 @@
     add by imflysquirrel
    +Hello World!

    那么反向提交的话就会删掉这行“Hello World!”, 下面用git revert 演示下。

    $ git revert HEAD
    [master 9086b68] Revert "modify a.txt b.txt"
     2 files changed, 2 deletions(-)

    git revert HEAD 表示revert HEAD指向的那次提交,也就是最新的那一次提交f0e0628。用git log看下提交历史:

    git log --oneline
    9086b68 (HEAD -> master) Revert "modify a.txt b.txt"
    f0e0628 (origin/master) modify a.txt b.txt
    d7e1e19 Merge pull request #1 from imflysquirrel/master
    0c550df modify b.txt by imflysquirrel
    7dd2e09 add two files a.txt b.txt

    新增了一个提交9086b68 ,原来的f0e0628 是还存在的。看下这时的b.txt,

    $ cat b.txt
    add by imflysquirrel

    “Hello World!” 那行已经被删除掉了。那么现在可以push了。

    $ git push origin master
    Counting objects: 3, done.
    Delta compression using up to 8 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (3/3), 316 bytes | 316.00 KiB/s, done.
    Total 3 (delta 1), reused 0 (delta 0)
    remote: Resolving deltas: 100% (1/1), completed with 1 local object.
    To github.com:flysqrlboy/git-command-tutorials.git
       f0e0628..9086b68  master -> master

    Ok! 成功push 到远程。

    7. 小结

    本文介绍了几个使用的git 命令。git stash 暂存代码。git reset 撤销本地提交。git revert 回退远程代码库。希望对你在使用git时有所帮助。如果觉得本文写的还行,请点个赞吧!也欢迎在讨论区留言做进一步交流。

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

    展开全文
  • git基于commit创建分支

    千次阅读 2020-01-03 18:54:00
    正常的创建分支参见:git基于远程master创建新分支 今天拉下来master,忘了拉分支,直接就改了commit了,然后push的时候失败才发现。git status On branch master Your branch is ahead of 'origin/master' by 1 ...

    正常的创建分支参见:git基于远程master创建新分支

    今天拉下来master,忘了拉分支,直接就改了commit了,然后push的时候失败才发现。git status

    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

    怎么把已经commit的内容不丢失,创建分支呢?

    需要多加一步,回到对应commit上去。

    git log

    找到对应的commit log。

    git checkout 141c517d5f94c17b0777

    会提示:

    ote: checking out '141c517d5f94c17b0777'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -b with the checkout command again. Example:
    
      git checkout -b <new-branch-name>
    
    HEAD is now at 141c517... commitmsg
    

    在执行git checkout -b +你想要创建的分支。

    发现内容都还在,没有丢失。

    展开全文
  • git commit分支

    千次阅读 2018-07-26 12:23:23
    git commit分支 commit:  在执行提交命令git commit之前,一定要git add要修改的文件,这样才能将更改的内容更新到本地。  在Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的...
  • 基于以前的commit创建一个分支 步骤: 1、确定需要取出版本的commitgit log 2、基于该commit创建分支 git branch &lt;branch name&gt; &lt;SHA1&gt; 3、切换到该分支 git checkout &lt...
  • git分支搜索代码,确定commit 所属分支首先需要知道常用的搜索分支git 命令为何?
  • git branch 命令查看分支、删除远程分支、本地分支

    万次阅读 多人点赞 2018-05-12 23:15:57
    1、查看本地分支git branch 前面带有*号的是当前分支 2 、删除本地分支git branch -d [branchname] 提示删除了一个名为list的本地分支 3、删除远程分支: git push origin --delete [branchname] ...
  • 我不知道大家有没有遇到过commit后切换到别的分支,再想切回来的时候发现找不到刚刚提的verson了,因为你可能没注意到刚才提交的分支是哪个举个可能遇见的例子: 你可能在公司用idea检出了以前的版本,回家后继续...
  • 从某一个commit开始创建本地分支 1、git log 查看提交 2、// 通过checkout 跟上commitId 即可创建制定commit之前的本地分支 git checkout commitId -b 本地新branchName 上传到远程服务器 // 依然通过...
  • 1、在提交commit分支上使用一下命令获取刚刚提交的commit编号 git status 2、切换到需要合并的分支,使用以下命令合并到目标分支 git cherry-pick 974d780... 3、如果没有冲突可以合并完成,如果有冲突则需要...
  • 在我们开发完分支后,一般分支上会有很多 commit —— 少不了诸如 “fix typo”, “sth wrong in the previous commit” 之类的 commit。在合并到主干的时候,往往这类 commit 显得臃肿多余。为了方便别人做 code ...
  • git rebase: 合并/截取commit分支间的commit拼接 一. 只涉及单独分支的操作 1. 合并commit 当前分支状态: A--------B-------C--------D |--想要合并的commit--| 预计合并之后的状态: A------...
  • “切换分支的时候最好保持一个清洁的工作区域。...git add但不git commit,可以git stash,然后git checkout到新分支,做修改,然后git checkout回到之前的分支之后git stash apply,再git com
  • git cherry-pick:复制多个提交commit到当前分支 git cherry-pick的作用是合并不同分支的若干个commit到当前分支,这些若干个commit代码提交可以是不同分支commit提交,如图: 现在master分支打算把develop分支...
  • 文章目录背景删除远程分支拉取指定 commitid 代码 背景 项目需要删除不用的远程分支 项目需要在原来某一次 commitid 的基础上修改一些东西 简单记录分享,方便日后查找 删除远程分支 分支切换到 master 使用: ...
  • 【github】github 创建新分支 git branch

    千次阅读 2018-10-29 10:58:20
    git branch 一、新建分支操作代码示例如下: 0、仓库克隆 github clone https://github.com/XiaoGongWei/TESTGIT 1、// 创建新分支 git branch -c xiaogongwei_v1.0 2、切换到新分支 git checkout ...
  • 有时候我们希望只合并某个分支上的某次修改commit到指定的分支上.那么就可以使用cherry-pick命令来...git cherry-pick 某个commit id // 把某个commit id的提交合并到当前分支. Git合并特定commits 到另一个分支
  • 1、git log -g : 显示已经commit的信息 如果commit信息过多的话,我们可以进行过滤查找: git log -g --author =“xxx@xx.com” // 根据用户名过滤 git log -g --grep “xx” //根据关键信息过滤 2、根据commit信息...
  • git push 本地项目推送到远程分支 git命令版

    万次阅读 多人点赞 2018-09-06 19:24:20
    1.在本地建立项目 可使用Eclipse,Idea等开发工具创建项目 打开根目录到所在在工程名的下一级 2.使用git 客户端 进入到上图目录HelloWord的文件夹里面 ... git commit -m "这是注释:初始化项目...
  • git commit

    千次阅读 2019-05-09 10:59:19
    目录 1Git commit常见用法 1.1 git commit -m “message” 1.2 git commit -a -m “massage” 1.3 git commit --amend ...2 git commit -m 和 git commit -am的区别 git教程:https://www.yiibai.com/git ...
  • git 将指定commit合并到指定的分支

    千次阅读 2018-09-10 15:53:11
    git diff commit_id1 commit_id2 &gt;&gt; update.diff 合并某个commit到指定分支 git log # 查看commit_id git checkout my_branch # 切换到指定分支 git cherry-pick commit_id # 将commit_id的提交...
  • git cherry-pick commit-id
  • 目前在主分支develop上开发产品,有项目分支Branch1、BranchN,在Branch1中发现了一个bug,在此分支已经修改并commit代码,此bug也在产品主分支develop和其它分支也存在,如何将此commit的代码commit到其它分支?...
  • Git合并某个分支的一个commit到另一个分支

    万次阅读 多人点赞 2018-06-15 15:54:33
    例如要将A分支的一个commit合并到B分支:首先切换到A分支git checkout Agit log找出要合并的commit ID :例如0128660c08e325d410cb845616af355c0c19c6fe然后切换到B分支上git checkout Bgit cherry-pick 0128660c08...
  • Git commit-tree 与 Git commit的区别

    千次阅读 2019-01-24 00:26:47
    'git commit-tree'指令基于一个tree的hash id创建了一个commit对象。 'git commit'则是将暂存区的内容放到仓库。暂存区的通常通常是一个commit对象。 所以,我们可以看到,要将这个commit-tree放入仓库中我们仍...
  • 想到了hooks,每次git commit的时,git会主动调用 .git/hooks/pre-commit 这个脚本(默认的*.sample不执行),脚本可以是shell、 python、ruby等可执行脚本,只要是 以非零状态 退出会导致中止,就commit失败。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,872
精华内容 45,948
关键字:

commit分支git