git使用的那些事儿

主要参考:廖雪峰的git教程阮一峰的git相关教程git官方文档

1、git本地已经进行了merge操作并提交,但是还没有push到远端仓库,此时要撤销本次merge操作,可以执行:

git reset --merge ORIG_HEAD

具体参考:Undo a Git merge that hasn't been pushed yet

2、如果在a分支执行了git stash,然后切换到b分支,干完活提交后准备恢复现场,结果没有切换回a分支就执行了git stash pop,怎么样恢复?

(1)首先,在错误的分支执行了git stash pop后,不管怎么样,首先就是工作区的代码被污染了(如果git commit了,那就是暂存区也被污染了),此时首先要做的肯定是还原回去:git reset --hard;

(2)切换回a分支,然后如果在当前终端还能找到之前的stash的hash码,则直接执行git stash commit hash_code即可,如果已经关闭过终端了,则可使用git log --graph --oneline $(git fsck | awk '/dangling commit/ {print $3}')找回;

具体可参考:找回pop掉的stash

3、git查看所有分支,包括远端分支:

git branch -a

4、git删除分支:

a、如果需要删除的分支不是当前分支,使用:git branch -d <branch_name>;

如果为删除当前所在分支,则使用:git branch -D <branch_name>

b、删除远程分支内容:git push origin :<branch_name>,注意,冒号前面的空格不能少,相当于把一个空分支push到远端server上,等于删除该分支。

具体可参考:Git删除分支/恢复分支Git删除分支

5、git merge相关介绍:git-merge完全解析

6、如果代码没有啥改动,但是发现commit消息没写好,可以使用:git commit --amend指令

可参考:Git commit 常见用法

7、git submodoule相关:

概念理解:子模块可以认为是主仓库里面包含的一个仓库,常见的是在主项目里的某个文件夹作为子模块,因此,如果需要查看子仓库的信息,要切换到相应的目录下,执行相应的git指令,如git status/branch/log等;

(1)目前碰到的一个问题,就是在测试服主仓库目录下,执行git status,发现子模块有commit,现在想更新子模块到最新,由于该修改为他人修改遗留,首先执行git reset --hard后,发现子模块还是有commit,执行git submodule update --init --recursive报错abort;解决方法是,切换到子模块目录下,再次执行git reset --hard后,子模块的工作区终于清理干净,然后执行git submodule update --init --recursive成功。

8、git仓库不再托管在.gitignore文件创建之前已git add到仓库中,但现在被.gitignore排除的文件:

单个文件:

git rm --cached <file>

文件夹:

git rm -r --cached <folder>

可参考:How to make Git “forget” about a file that was tracked but is now in .gitignore?

9、git rebase:

请参考:git rebase 使用详解

10、git修改上次提交,但还没push到远端的commit说明:

git commit --amend -m "New commit message"

参考:How to modify existing, unpushed commit messages?

11、git设置和取消代理:

git config --global http.proxy http://127.0.0.1:1080

git config --global https.proxy https://127.0.0.1:1080

git config --global --unset http.proxy

git config --global --unset https.proxy

还有针对 github.com 的单独配置:

#只对github.com
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080

#取消代理
git config --global --unset http.https://github.com.proxy

12.git commmit -m注释中换行:

使用单引号',也即git commit -m '(1)line 1

(2)line 2

13.git通用工作流

说明:假设当前分支为test,基于master,多人在master分支上开发

(1)现在本地代码已经更改完,git status检查当前的修改

(2)git add -i将通过检查的修改加到暂存区

(3)git commit提交本地修改

(4) git push origin test修复推送到远端分支

(5)提交mr,gitlab web页面提示不能merge,因为其他同事已经提交了很多修改到master(也即test分支已经落后master很多了),且与test分支的修改有冲突,需要先解决冲突

(6)此时本地合并远端master的修改(并解决冲突)有两种方式:

a. git pull origin master,然后解决冲突,再git commit, 然后push到远端test分支,此时gitlab web界面的merge按钮将enable,表示远端test分支可以合并到远端master分支(按一下merge按钮即可);这种方式操作简单,没有太多复杂概念,最主要的缺点是git log看起来很乱,多了一个"merge origin/master to test"这样的commit

b.git checkout master && git pull && git checkout test && git rebase master,然后就是一直按照提示解决冲突,git add {conflict_file}, git rebase --continue, 直到所以冲突解决掉(过程极其漫长,特别是落后于master很多的时候),然后就是执行git pull,解决冲突,然后git push(???这个有待验证,因为当时按照解决冲突后用了git add xxx && git commit,执行后多了一条“merge test into test”的commit log...),这种方式主要就是分支树比较好看(......),主要缺点就是操作复杂,有点秀

(7)git pull origin test把合并master的修改推送到远端,此时gitlab web界面的merge按钮将enable,可以界面合并test分支到master了

补充说明:

a.其实web界面合并分支的操作,就是等价于本地git checkout master && git pull && git merge test && git push origin master(也即本地切换到master分支,拉取远端master最新的代码,然后合并test分支,然后推到远端),但是推到远端master需要较高的权限(owner), developer角色没有权限推送到protected branch(如master分支)

b.git rebase的相关操作参考本文第9点

总结:master分支合并feature分支,使用git merge;feature分支拉取远端master分支的最新代码,使用git pull origin master或者git rebase master

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值