GIT使用场景

场景一

假设git库里面有dev和master两个分支,dev上有两个commit,仅仅需要把其中的一个commit提交到master。

git lg
//* df09a9c - (HEAD -> dev, origin/dev) 新增s.inc (16 minutes ago) <user>
//* b11ca58 - 新增t.inc (17 minutes ago) <user>
//* 52f2e93 - (origin/master, origin/HEAD, master) add mysql load data (4 months ago) <user>
//. . .
//现在要将仅仅将 df09a9c 提交增加到master分支
git checkout master
//Switched to branch 'master'
//Your branch is up-to-date with 'origin/master'.
git cherry-pick df09a9c
//[master 93c97ed] 新增s.inc
//Date: Fri Apr 14 20:03:31 2017 +0800
//1 file changed, 1 insertion(+)
//create mode 100644 s.inc
git push origin master
git lg
//* 93c97ed - (HEAD -> master, origin/master, origin/HEAD) 新增s.inc (7 minutes ago) <user>
//| * df09a9c - (origin/dev, dev) 新增s.inc (26 minutes ago) <user>
//| * b11ca58 - 新增t.inc (27 minutes ago) <user>
//|/
//. . .

场景二

假设当前分支dev,提交了a,并且已经push到origin/dev,现在要取消a的提交。

git lg -all
//* 4c44f91 - (HEAD -> dev, origin/dev) 删除t.inc (26 seconds ago) <user>
//* df09a9c - 新增s.inc (43 minutes ago) <user>
//* b11ca58 - 新增t.inc (44 minutes ago) <user>
//| * 93c97ed - (origin/master, origin/HEAD, master) 新增s.inc (24 minutes ago) <user>
//|/
//. . .
//取消4c44f91的提交
git revert 4c44f91
//[dev 0bf457d] Revert "删除t.inc"
// 1 file changed, 1 insertion(+)
// create mode 100644 t.inc
git push origin dev
git lg --all
//* 0bf457d - (HEAD -> dev, origin/dev) Revert "删除t.inc" (3 minutes ago) <user>
//* 4c44f91 - 删除t.inc (5 minutes ago) <user>
//* df09a9c - 新增s.inc (48 minutes ago) <user>
//* b11ca58 - 新增t.inc (49 minutes ago) <user>
//| * 93c97ed - (origin/master, origin/HEAD, master) 新增s.inc (29 minutes ago) <user>
//|/
//. . .

场景三

master分支合并dev分支并且已经push到origin/master,取消此次合并。

git checkout master
git merge dev
git push origin master
git lg --all
//*   8bd0cf5 - (HEAD -> master, origin/master, origin/HEAD) Merge branch 'dev' (83 seconds ago) <user>
//|\
//| * 0bf457d - (origin/dev, dev) Revert "删除t.inc" (6 minutes ago) <user>
//| * 4c44f91 - 删除t.inc (9 minutes ago) <user>
//| * df09a9c - 新增s.inc (51 minutes ago) <user>
//| * b11ca58 - 新增t.inc (52 minutes ago) <user>
//* | 93c97ed - 新增s.inc (32 minutes ago) <user>
//|/
//. . .
//查看要取消的合并commit
git show 8bd0cf5
//Merge: 93c97ed 0bf457d
//Author: user <gt199899@gmail.com>
//Date:   Fri Apr 14 20:53:15 2017 +0800
//
//    Merge branch 'dev'
//执行取消,-m 后面有个参数1和2,1为取消合并之后以当前分支为主
git revert 8bd0cf5 -m 1
//[master 8e27b81] Revert "Merge branch 'dev'"
// 1 file changed, 1 deletion(-)
// delete mode 100644 t.inc
git push origin master
git lg --all
//* 8e27b81 - (HEAD -> master, origin/master, origin/HEAD) Revert "Merge branch 'dev'" (2 minutes ago) <user>
//*   8bd0cf5 - Merge branch 'dev' (11 minutes ago) <user>
//|\
//| * 0bf457d - (origin/dev, dev) Revert "删除t.inc" (16 minutes ago) <user>
//| * 4c44f91 - 删除t.inc (19 minutes ago) <user>
//| * df09a9c - 新增s.inc (61 minutes ago) <user>
//| * b11ca58 - 新增t.inc (62 minutes ago) <user>
//* | 93c97ed - 新增s.inc (42 minutes ago)
//|/
//. . .

场景四

现在dev分支上有四个commit,要把连续的前三个commit提交到master,场景一里面有单个处理方式,对于连续的commit,可以批量提交到master。

git lg --all
//* a69afb4 - (HEAD -> dev, origin/dev) add d.inc (21 seconds ago) <user>
//* b69d0ed - add c.inc (2 minutes ago) <user>
//* 3cd7467 - add b.inc (2 minutes ago) <user>
//* fcc6515 - add a.inc (4 minutes ago) <user>
//| * 8e27b81 - (origin/master, origin/HEAD, master) Revert "Merge branch 'dev'" (4 days ago
//. . .
//现在仅需提交 fcc6515,3cd7467,b69d0ed 三个到master
git checkout master
git cherry-pick fcc6515^..b69d0ed
//[master dcdda59] add a.inc
// Date: Tue Apr 18 11:25:45 2017 +0800
// 1 file changed, 0 insertions(+), 0 deletions(-)
// create mode 100644 a.inc
//[master aa94e66] add b.inc
// Date: Tue Apr 18 11:27:45 2017 +0800
// 1 file changed, 0 insertions(+), 0 deletions(-)
// create mode 100644 b.inc
//[master 9a1abd7] add c.inc
// Date: Tue Apr 18 11:28:19 2017 +0800
// 1 file changed, 0 insertions(+), 0 deletions(-)
// create mode 100644 c.inc
git lg --all
//* 9a1abd7 - (HEAD -> master, origin/master, origin/HEAD) add c.inc (2 minutes ago) <tgao>
//* aa94e66 - add b.inc (2 minutes ago) <tgao>
//* dcdda59 - add a.inc (2 minutes ago) <tgao>
//. . .

其中,用cherry-pick选择一段commit区间有两种格式:

  • git cherry-pick [commit-id]^…[commit-id],这种格式提交包含两端和区间。
  • git cherry-pick [commit-id]…[commit-id],这种格式提及不包含开始端,仅包含结束端和区间。

场景五

.gitignore里面忽略已经被提交到远端的文件。
例如将a.inc加入ignore文件,但是a.inc已经被提交到远端。
应该先删除本地a.inc缓存。

git rm --cached a.inc

然后将a.inc增加到ignore文件里。
然后提交并push到远端。
此时此文件被忽略,先删再增加到ignore和先增加到ignore后删,效果一样,需要注意的是:如果忽略的关键文件,push到远端之后,远端的文件也会被删除掉,需要手动新建文件。

场景六

放弃本地所有修改

# git checkout .
# 删除本地所有修改
# git clean -df
# 删除本地所有新增文件,d删除文件夹,f强制执行
git checkout . && git clean -df

场景七

git默认模式fileMode=true,当文件的权限修改之后,会把这个修改也提交到git库里面去;
例如:

git diff 1182bca5d --summary
mode change 100644 => 100755 README.md

将fileMode修改为false,忽略文件权限更改;

git config --global core.fileMode false
git diff 1182bca5d --summary

PS:.git/config 里面也有一行fileModel=true,如果上面修改没有生效,看下是不是这里没有更改,上面全局的设置了之后,可以直接将这一样删掉;

场景八

比如master分支的提交记录如下:
a - b - c - d (master/origin:master)
这个时候发现c和d这两个commit有误,将reset --hard到b,然后执行正确的修改;
a - b - c - d (master/origin:master)
     \
      e (HEAD)
这个时候使用强推覆盖远端master分支:git push --force origin master,之后会变成
a - b - e (master/origin:master)

这种情况很少会遇到,一般遇到用revert就能完美解决;但是意外中奖用revert解决不了的,可以强推;但是要谨慎,强推会强制覆盖远端分支,会丢失commit,例如这里面的c和d两个commit就丢失了,没有100%把握不要–force;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值