前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >5. Git 进阶高频操作

5. Git 进阶高频操作

作者头像
acc8226
发布于 2022-05-17 06:43:45
发布于 2022-05-17 06:43:45
74600
代码可运行
举报
文章被收录于专栏:叽叽西叽叽西
运行总次数:0
代码可运行

stash 储藏

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug

--include-untracked 参数可以额外储藏新的未被追踪的文件。 --all 选项将收集所有未跟踪的文件以及在 .gitignore 和 排除文件中明确忽略的文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 更推荐对 stash 加一些注释
`git stash save 'message'` 
`git stash save --include-untracked 'message'` 
`git stash save --all -untracked 'message'` 

Git 把 stash内容存在某个地方了(包含了工作区 和 暂存区的内容),但是需要恢复一下,有两个办法:

  • git stash apply恢复,但是恢复后,stash内容并不删除,你需要用 git stash drop来删除;
  • 另一种方式是 git stash pop,恢复的同时把 stash 内容 pop 出去.

按保存时间由近及远的顺序列举出储藏栈。 git stash list

恢复指定的stash, 只需要指定序号, stash@{0}代表最新的stash。依次是次新的数据,按照时间新到旧排序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git stash apply stash@{0}

此时, 变更内容都还原到了工作区.

清空所有 stash 信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git stash clear

要用其他更基础的 Git 命令来达到相同的效果,需要手动创建一个新分支,在新分 支上提交所有修改,之后回到之前的分支继续工作,最后把你保存的分支状态恢复到新的工作目录。如果还不清楚,下面将展示这样的过程。

有时,储藏你的变更会导致你的分支上出现一个全新的开发序列,并且在最终还原你的储藏状态到所有变更之前时可能没有直接意义。此外,合并冲突可能会导致弹出操作难以进行。然而,你可能仍需要恢复你储藏的内容。在这种情况下, git 提供了git stash branch 命令来帮助你。这条命令基于储藏条目生成时的提交,会将保存的储藏内容转换到一个新分支。

因此我们重置一些状态,采用一些不同的方法,创建一个名为 mod 的新分支来包含那些储藏的变更。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 $ git stash branch mod
# 操作 mod 分支
...
# 切回 master 分支,并进行合并
 $ git checkout master
 Switched to branch 'master
 $ git merge mod

以下展示在没有 stash 命令之前怎么保存临时提交

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 常规开发试程中断

# 创建一个新分支来保存状态
 git checkout -b saved_state
 git commit -a -m "Saved state"

#回到之前的分支进行更新
 $ git checkout master

# 编辑紧急修复
 git commit -a-m "Fix something."

# 恢复保存的状态到工作目录
git checkout saved state
git reset -soft HEAD

#..继续之前我们离开时的工作

cherry-pick

git cherry-pick提交命令会在当前分支上应用给定提交引入的变更。这将引入一个新的独特的提交。严格来说,使用git cherry-pick并不改变版本库中的现有历史记录,而是添加历史记录。

跟其他通过应用 diff 来引入变更的Git操作一样,你可能需要解决冲突来完全应用给定提交的变更。

git cherry-pick 命令通常用于把版本库中一个分支的特定提交引入一个不同的分支中。

git cherry-pick <提交号1> <提交号2> <提交号3> 挑选多个提交合并, 提交之间用空格相隔

挑选区间, 左开右闭.其中,<start-commit>在时间上必须早于<end-commit> git cherry-pick <start-commit>..<end-commit>

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git cherry-pick <subcommand>

    --quit                end revert or cherry-pick sequence 结束pick操作,但是不会影响冲突之前多个提交中已经成功的
    --continue            resume revert or cherry-pick sequence  //继续下个操作
    --abort               cancel revert or cherry-pick sequence 直接打回原形

    -n, --no-commit       don't automatically commit 不自动提交
    -e, --edit            edit the commit message 编辑提交信息
    -s, --signoff         add Signed-off-by:
    -m, --mainline <parent-number>
                          select mainline parent
    --rerere-autoupdate   update the index with reused conflict resolution if possible
    --strategy <strategy>
                          merge strategy
    -X, --strategy-option <option>
                          option for merge strategy
    -S, --gpg-sign[=<key-id>]
                          GPG sign commit
    -x                    append commit name
    --ff                  allow fast-forward
    --allow-empty         preserve initially empty commits
    --allow-empty-message
                          allow commits with empty messages
    --keep-redundant-commits
                          keep redundant, empty commits

如果在git cherry-pick 后加一个分支名,则表示将该分支顶端提交进cherry-pick,如:git cherry-pick <branch name>

rebase 交互式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rebase -i

如果你在命令后增加了这个选项, Git 会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。

此模式下你可以重新排序、编辑、删除,把多个提交合并成一个,把一个提交分离成多个, 然后把它们放回原来的分支或者不同的分支。

git rebase -i HEAD^ 区间范围为 [HEAD, HEAD] git rebase -i HEAD~2 区间范围为 (HEAD~2, HEAD] ,为左开右闭区间。 git rebase -i HEAD~3 区间范围为 (HEAD~3, HEAD]

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git rebase -i HEAD~3

pick ba16ab5 1
pick 4e71e75 aiya
pick cc4b570 someMessage

# Rebase c277d53..cc4b570 onto c277d53 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label

其中 s, squash 将会所在行所在的提交合并到前一个提交中

一般为方便确认 rebase 的返回,通常和 git show-branch --more=nums [branchName] 搭配使用。

分支开发策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在 dev 分支上,也就是说,dev 分支是不稳定的,到某个时候,比如 1.0 版本发布时,再把 dev 分支合并到 master上,在 master 分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往 dev 分支上合并就可以了。

选择分支的衍合 or 合并

衍合的风险

呃,奇妙的衍合也并非完美无缺,要用它得遵守一条准则: 一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。

如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些尚未公开的提交对象,就没问题。如果衍合那些已经公开的提交对象,并且已经有人基于这些提交对象开展了后续开发工作的话,就会出现叫人沮丧的麻烦。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Git】Common Git Command Line Operation
Common Git Command Line Operation | Chanvin's Blog (chanvinxiao.com)
阿东
2024/03/05
1510
【Git】Common Git Command Line Operation
Git 实用指南
Git 是一个分布式的版本控制工具,因此远程和本地可以视为两个独立的 Git 仓库。上图是一张经典的 Git 中的数据流与存储级别的介绍,其中储存级别主要包含几部分:
grain先森
2019/05/06
6680
Git 实用指南
工作中如何优雅的使用 Git
在本系列的前两篇博文中,笔者对 Git 以及 Git flow 进行了大致的介绍,相信各位读者已经对 Git 有了大致的了解。但是,在我们的日常工作中使用 Git 时常会遇到的各种突发状况,那么我们应该怎么合理的应对这些状况呢?俗话说,无规矩不成方圆,在团队协作中,如何规范 Git Commit 呢?本文将针对以上问题展开讨论,探讨一下在日常工作中,我们应该如何优雅的使用 Git?
BUG弄潮儿
2021/04/26
6870
git常用操作都在这里了(二)
git常用分支操作 git不要在下代码的主分支上修改代码,要checkout一个开发分支,在上面开发,开发完成后再切换回主分支, 进行衍合或合并操作。最后再在主分支上向远程提交代码。类似的修bug也要在主分支上创建一个分支进行操作, 永远确保主分支是稳定版。 git修改密码 打开git bash 输入 cd ~/.ssh ls 确定有 id_rsa 和 id_rsa.pub文件 ssh-keygen -p -f id_rsa 第一次输入旧密码 新密码 确认新密码 git压缩多次提交为一次提交 切记已经推送到
阿章-python小学生
2018/05/18
9710
Git 帮助手册
国外网友制作了一张 Git Cheat Sheet,总结很精炼,各位不妨收藏一下。
硬件开源小站
2023/04/07
4.4K1
Git 帮助手册
45个 GIT 经典操作场景,专治不会合代码
git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景,仍然需要我们掌握足够多的git命令。
程序员小富
2022/03/04
1.9K0
45个 GIT 经典操作场景,专治不会合代码
常用的Git Tips
一、Configuration:配置 列举所有的别名与配置 git config --list Git 别名配置 git config --global alias. git config --global alias.st status 设置git为大小写敏感 git config --global core.ignorecase false 二、Help:常用的辅助查询命令 在git 命令行里查看everyday git git help everyday 显示git常用的帮助命令 git help -g 获取Git Bash的自动补全 ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc 设置自动更正 git config --global help.autocorrect 1 三、Remote:远端仓库配置 获取所有远端引用配置 git remote 或者 git remote show 修改某个远端的地址 git remote set-url origin URL Repo 查看当前仓库中的所有未打包的objects和磁盘占用 git count-objects --human-readable 从object数据库中删除所有不可达的object git gc --prune=now --aggressive 四、文件类操作 ,Cache:缓存,Track:文件追踪, 展示所有被追踪的文件 git ls-files -t 展示所有未被追踪的分支 git ls-files --others 展示所有被忽略的文件 git ls-files --others -i --exclude-standard git check-ignore* git status --ignored Manipulation:操作 停止追踪某个文件但是不删除它 git rm --cached <file_path 或者 git rm --cached -r <directory_path 强制删除未被追踪的文件或者目录 git clean -f git clean -f -d git clean -df 清空.gitignore git clean -X -f Changes:修改 Info:信息查看 查看上次提交之后的未暂存文件 git diff 查看准备用于提交的暂存了的修改的文件 git diff --cached 显示所有暂存与未暂存的文件 git diff HEAD 查看最新的文件版本与Stage中区别 git diff --staged dd:追踪某个修改,准备提交 Stage某个文件的部分修改而不是全部 git add -p Reset:修改重置 以HEAD中的最新的内容覆盖某个本地文件的修改 git checkout -- <file_name> Stash:贮存 Info:信息查看 展示所有保存的Stashes git stash list Manipulation:操作 Save:保存 保存当前追踪的文件修改状态而不提交,并使得工作空间恢复干净 git stash 或者 git stash save 保存所有文件修改,包括未追踪的文件 git stash save -u 或者 git stash save --include-untracked Apply:应用 应用任何的Stash而不从Stash列表中删除 git stash apply <stash@{n}> 应用并且删除Stash列表中的最后一个 git stash pop 或者 git stash apply stash@{0} && git stash drop stash@{0} 删除全部存储的Stashes git stash clear 或者 git stash drop <stash@{n}> 从某个Stash中应用单个文件 git checkout <stash@{n}> -- <file_path> 或者 git checkout stash@{0} -- <file_path> Commit:提交 检索某个提交的Hash值 git rev-list --reverse HEAD | head -1 Info:信息查看 List:Commit列表 查看自Fork Master以来的全部提交 git log --no-merges --stat --reverse master.. 展示当前分支中所有尚未合并到Master中的提交 git cherry -v master 或者 git cherry -v master <branch-to-be-merged> 可视化地查看整个Version树
竹清
2018/08/31
7180
Git 合并多次提交
在合并分支的时候,希望将多次提交合并成一个,然后再 cherry-pick 到主分支。
zucchiniy
2020/05/22
1.5K0
我在工作中是如何使用Git的
最近在网上有个真实发生的案例比较火,说的是一个新入职的员工,不会用 Git 拉代码,第二天被开除。由此,可见 Git 对我们工作的重要性,无论是前端后端,都是离不开 Git 的,下面就让我们一探究竟吧。
政采云前端团队
2021/07/19
1.9K0
Git之Bug分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。 当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交: $ git status On branch dev Changes to be committed: (use "git reset HEAD <file>.
兮动人
2021/06/11
3090
Git 从入门到精通,这篇包教包会!
集中化的版本控制系统,诸如 CVS,Subversion 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
java思维导图
2020/03/03
2.7K0
Git 小手记
记录一下日常的 git 使用与我平时用的 git 小窍门. 关于 rebase 为什么不能在 master 上做 rebase 操作? rebase 与 merge 操作是同一类的操作, 都是用于合并
翼德张
2022/01/13
5960
git学习总结03 — 分支管理
merge 分支合并有 fast-forward 和 no-fast-forward 两种模式。下图 dev 合入 master,默认触发快进模式(fast-forward),因为只需要修改指针即可实现合并;而普通模式(no-fast-forward)需要生成一个新的commit,因此即使 dev 分支删除,也能从 master 分支历史上看出分支合并信息。
CS逍遥剑仙
2020/05/30
1.5K0
日常开发过程中实际场景下使用git的一些简单总结
公司内部有代码仓库和 github 仓库邮箱不一致。例如已经全局配置了公司内的信息
ACK
2020/05/26
4780
Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
上篇博客聊了《git分支管理之rebase 以及 cherry-pick相关操作》本篇博客我们就以Learning Git中的关卡进行展开。下方列举了LearningGit中的 merge、rebase、reset、revert、cherry-pick 以及交互式rebase相关关卡的操作以及对应的解析。后边在聊交互式rebase操作是,不单单给出了LearningGit中的内容,而且给出了真正的Git分支在交互式rebase操作时的具体案例。 learngitbranching的地址为:https://l
lizelu
2018/03/28
17.7K0
Git知识总览(五) Git中的merge、rebase、cherry-pick以及交互式rebase
Git 进阶使用1
Git 作为全球软件开发者的标配代码管理工具,是程序员离不开的日常伙伴,除了基本的几条命令外,git其实还有很多日常会用到的option,这里以我的个人经验做个总结
Kevinello
2022/10/09
7730
git 常用指令与简单规范
随着前端项目数量、前端开发人员、前端业务的日渐增多,则非常有必要整理一份简单的 git 规范,来进行项目开发的规范化约束。本文包括开发常用 git 指令、git 分支管理规范、git 提交规范等。
蓓蕾心晴
2023/10/19
2920
Git中文命令[参数]大全
设置和配置 git config help 获取和创建项目 init clone 基本快照 add status diff commit reset rm mv 分支和合并 branch checkout merge mergetool log stash tag worktree 共享和更新项目 fetch pull push remote submodule 检查和比较 show log diff shortlog describe 修补 apply cherry-pick diff rebase revert 调试 bisect blame grep
cuijianzhe
2024/02/03
5430
git必知必会
暂存区(stage / index): 保存了下次将提交的文件列表信息, 一般存放在 .git目录下 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
互联网金融打杂
2019/05/23
1K0
我在团队的技术分享-Git日常操作我在团队的技术分享-Git日常操作
工作流程如下: 1、从远程仓库克隆代码到本地仓库 2、在本地仓库中checkout代码然后进行代码修改 3、在提交代码前先将代码提交到暂存区 4、提交到本地仓库。本地仓库中保存修改的各个历史版本 5、修改完成后,需要和团队共享代码时,将代码push到远程仓库
Light413
2021/12/08
7050
我在团队的技术分享-Git日常操作我在团队的技术分享-Git日常操作
相关推荐
【Git】Common Git Command Line Operation
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验