几个git进阶操作,让你离效率更近一步

rebase 合并

该命令可以让和 merge 命令得到的结果基本是一致的。
通常使用 merge 操作将分支上的代码合并到 master 中,分支样子如下所示
image.png
使用 rebase 后,会将 develop 上的 commit 按顺序移到 master 的第三个 commit 后面,分支样子如下所示
image.png
Rebase 对比 merge,优势在于合并后的结果很清晰,只有一条线,劣势在于如果一旦出现冲突,解决冲突很麻烦,可能要解决多个冲突,但是 merge 出现冲突只需要解决一次。
使用 rebase 应该在需要被 rebase 的分支上操作,并且该分支是本地分支。如果 develop 分支需要 rebase 到 master 上去,那么应该如下操作

## branch develop
git rebase master
git checkout master
## 用于将 `master` 上的 HEAD 移动到最新的 commit
git merge develop

rebase 冲突解决

如果发生冲突,git rebase 会在第一个有问题的提交停止,并在文件中留下冲突标记。您可以使用 git diff 来定位标记 (<<<<<<) 并进行编辑以解决冲突。对于你编辑的每个文件,你需要告诉Git冲突已经解决,这通常是用如下命令完成

git add <filename>

在手动解决冲突并使用所需的解决方案更新暂存区之后,您可以使用如下命令继续变基流程

git rebase --continue

或者你可以使用如下命令撤销 git rebase

git rebase --abort

–onto 选项——指定新提交起点
新提交的起始点。如果没有指定——onto选项,则起始点为 。可以是任何有效的提交,而不仅仅是现有的分支名称。
–continue 选项——继续变基
在解决合并冲突后重新启动变基流程。
–abort 选项——终止变基
中止变基操作并将 HEAD 重置到原始分支。如果在 rebase 操作开始时提供了 ,那么 HEAD 将被重置为 。否则,HEAD 将被重置到变基操作开始时的位置。
–skip 选项——跳过冲突的提交
跳过当前冲突的提交,继续变基流程。
–quit 选项——终止变基
中止变基操作,但不会将HEAD重置回原始分支。因此,暂存区和工作区也保持不变。

stash 保存临时改动

stash 用于临时保存工作目录的改动。开发中可能会遇到代码写一半需要切分支打包的问题,如果这时候你不想 commit 的话,就可以使用该命令。

 git stash

使用该命令可以暂存你的工作目录,后面想恢复工作目录,只需要使用

 git stash pop

这样你之前临时保存的代码又回来了

reset 重置分支

如果你想删除刚写的 commit,就可以通过以下命令实现

 git reset --hard HEAD^

但是 reset 的本质并不是删除了 commit,而是重新设置了 HEAD 和它指向的 branch。

cherry-pick 挑选分支重新提交

如果你想把另一个分支的一个提交复制到当前分支,就可以通过以下命令实现

## 切换到指定分支
git checkout 
## 查找提交时的Hash
git log 
## 切换回自己的分支,
git cherry-pick <Hash>

cherry-pick也支持迁移多个提交复制到指定分支:

## 迁移多个不连续提交记录
git cherry-pick <HashA> <HashB>
## 迁移一系列的连续提交,A为开始Hash, B为结束Hash,A要早于B
git cherry-pick A..B 
## 迁移一系列的连续提交,但不包含A
git cherry-pick A^..B

误删,漏提交代码找回

reflog 日志,误删找回

reflog 可以看到 HEAD 的移动记录,假如之前误删了一个分支,可以通过 git reflog 看到移动 HEAD 的哈希值
image.png
从图中可以看出,HEAD 的最后一次移动行为是 merge 后,接下来分支 new 就被删除了,那么我们可以通过以下命令找回 new 分支

git checkout 37d9aca
git checkout -b new

PS:reflog 记录是时效的,只会保存一段时间内的记录。

stash 误删找回

第一步:git fsck --unreachable

使用git fsck --unreachable命令查找所有unreachable记录
例如:
image.png

第二步:git show +

使用git show +命令查找你需要恢复的那一条工作现场,sha是上面的key。
也可以使用 git cat-file -p +可以查看工作现场。
如果是blob,会显示完整代码。
如果是commit,可能看到的会是多个对象,例如:
image.png

第三步:git stash apply +

使用git stash apply +即可恢复,sha就是你打算恢复的那一条记录的key。但只可能恢复unreachable commit 开头的记录,unreachable blob是不能用git statsh apply+来恢复的,会报not a stash-like commit 错误。
unreachable commit的开头的也可能报错:

<sha> is not a stash-like commit。 

这时怎么处理呢?

1)切换到丢掉stash的那个分支。
2)git merge +即可。如有冲突,处理一下就好。

漏提交代码找回

通过以下文档,看对应自己的情况,进行处理
Git 代码丢了?莫慌! - 寸寸君 - 博客园 (cnblogs.com)

本地一个分支向remote不同仓库推送代码

建一个名称叫 all 的仓库本地别名,名称你可自己定。

git remote add all git@github.com:xxx/xxx.git

此时,使用 git remote -v 命令,本地就会有一个 push, pull 的远程信息

git remote -v

all	git@github.com:xxx/xxx.git (fetch) 
all	git@github.com:xxx/xxx.git (push)

要把第 2 个仓库(http://coding.net)的地址加到 all 的 push 地址中。

git remote set-url all --push --add git@coding.net:xxx/xxx.git
git remote set-url all --push --add git@github.com:xxx/xxx.git

**注意:**添加完 http://coding.net 后,还需要把原来的 github.com 添加一遍。
再次 git remote -v 查看,多了一条 push 的 url。

git remote -v

all	git@github.com:xxx/xxx.git (fetch) 
all	git@github.com:xxx/xxx.git (push) 
all	git@coding.net:xxx/xxx.git (push)

推送

git push all

以上会把本地提交同时推送到 github.com 和 coding.net。

mac调整账号密码存储

在mac中自动保存git的用户名和密码很简单,只需要在终端命令行中输入下面的命令就是:

git config --global credential.helper osxkeychain

然后在git 操作中 只要输入一次账号名和密码 ,在之后的操作中 就不需要再次输入了

备份、还原仓库

# 备份
git clone --bare <git地址>

# 还原
git clone <本地镜像文件夹多以.git结尾> <目标文件夹>

关联远程仓库

git remote add <远程仓库名称,默认:origin> <地址>

关联远程分支

git branch --set-upstream-to=origin/master master(将本地master设置为远程master分支)

内容参考:

git cherry-pick 教程 - 阮一峰的网络日志 (ruanyifeng.com)
CS-Interview-Knowledge-Map/git-zh.md at master
git rebase 变基命令——移花接木
恢复被删除的Git stash记录 - 简书 (jianshu.com)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sprialmint

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

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

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

打赏作者

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

抵扣说明:

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

余额充值