re-base

如何将分离的HEAD与master / origin协调?

十年热恋 提交于 2019-12-29 11:26:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我是Git分支复杂的新手。 我总是在一个分支上工作并提交更改,然后定期推送到我的远程源。 在最近的某个地方,我重置了一些文件以使它们脱离提交暂存,后来又做了一个 rebase -i 来摆脱最近几次本地提交。 现在我处于一种我不太了解的状态。 在我的工作区域, git log 显示了我所期待的 - 我在正确的列车上,我不想要的提交,以及那里的新提交等。 但是我只是推送到远程存储库,并且有什么不同 - 我在rebase中杀死的一些提交被推送,而本地提交的新提交不存在。 我认为“master / origin”与HEAD分离,但我不是100%清楚这意味着什么,如何使用命令行工具将其可视化,以及如何修复它。 #1楼 将您的分离提交放到自己的分支上 只需运行 git checkout -b mynewbranch 。 然后运行 git log ,你会看到提交现在是这个新分支的 HEAD 。 #2楼 我遇到了这个问题,当我读到最高投票答案: HEAD是当前签出的提交的符号名称。 我想:啊哈! 如果 HEAD 是为currenlty结账符号名提交,我可以调和这对 master 通过衍合靠在 master : git rebase HEAD master 这个命令: 检查出 master 将 HEAD 的父提交标识回 HEAD

将Git分支合并到master中的最佳(最安全)方法是什么?

霸气de小男生 提交于 2019-12-29 09:56:31
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 从 master 创建了一个新分支,我们称之为 test 。 有几个开发人员要么致力于 master 要么创建其他分支,然后合并成 master 。 假设 test 工作需要花费几天的时间,并且您希望通过 master 内的提交来不断更新 test 。 我会做 git pull origin master 从 test 。 问题1: 这是正确的方法吗? 其他开发人员可以像我一样轻松地处理相同的文件。 我的 test 工作已经完成,我准备将其合并回 master 。 这是我可以想到的两种方法: A: git checkout test git pull origin master git push origin test git checkout master git pull origin test B: git checkout test git pull origin master git checkout master git merge test 我不使用 --rebase 因为据我所知,rebase将获得 master 的更改并在此基础上堆叠我的更改,因此它可能会覆盖其他人所做的更改。 问题2: 这两种方法中哪一种是正确的? 有什么区别? 所有这一切的目的是使我的 test 分支随时 master

高频使用的 Git 命令集合,看完自信 git push!

百般思念 提交于 2019-12-27 09:33:41
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> CRPER https://juejin.im/post/5de8d849e51d455808332166 前言 汇总下我在项目中高频使用的git命令及姿势。 不是入门文档,官方文档肯定比我全面,这里是结合实际业务场景输出。 使用的 Git版本:git version 2.24.0 git log 查看日志,常规操作,必备 # 输出概要日志,这条命令等同于 # git log --pretty=oneline --abbrev-commit git log --oneline # 指定最近几个提交可以带上 - + 数字 git log --oneline -5 # 提供类似 GUI 工具的 log 展示 git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset' git status 查看工作区状态的东东,不如GUI直观,但是命令行也有一些用的 # 等同 git status --long,查看当前工作区暂存区变动 git status # 概要信息 (--short) git status -s # 查询工作区中是否有stash存在(暂存的东西)

我什么时候应该使用git pull --rebase?

旧街凉风 提交于 2019-12-21 15:59:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我知道有些人默认使用 git pull --rebase ,而其他人坚持不使用它。 我相信我理解合并和变基之间的区别,但我试图把它放在 git pull 的上下文中。 它只是不想看到很多合并提交消息,还是有其他问题? #1楼 我认为这归结为个人偏好。 你想在推动改变之前隐藏你的愚蠢错误吗? 如果是这样, git pull --rebase 就是完美的。 它允许您稍后将提交压缩到几个(或一个)提交。 如果您在(未按下的)历史记录中进行了合并,那么稍后进行 git rebase 就不那么容易了。 我个人不介意发布我所有的愚蠢错误,所以我倾向于合并而不是rebase。 #2楼 我认为你应该在与同一分支上的其他人合作时使用 git pull --rebase 。 你正在工作→提交→工作→提交周期,当你决定推动你的工作时,你的推动被拒绝,因为在同一个分支上有并行工作。 在这一点上,我 总是 做一个 pull --rebase 。 我不使用squash(以展平提交),但我重新设置以避免额外的合并提交。 随着您的Git知识的增加,您发现自己在历史上看起来比我使用的任何其他版本控制系统更多。 如果你有大量的小合并提交,很容易失去你历史上正在发生的大局的焦点。 这实际上是我唯一一次进行变基(*)

git 常用命令

限于喜欢 提交于 2019-12-20 19:37:19
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在日常工作中,经常会用到Git操作。但是对于新人来讲,刚上来对Git很陌生,操作起来也很懵逼。本篇文章主要针对刚开始接触Git的新人,理解Git的基本原理,掌握常用的一些命令。 一、Git工作流程 以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词。 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 工作区 程序员进行开发改动的地方,是你当前看到的,也是最新的。 平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。 暂存区 .git目录下的index文件, 暂存区会记录 git add 添加文件的相关信息(文件名、大小、timestamp...),不保存文件实体, 通过id指向每个文件实体。可以使用 git status 查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。 当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过 git add 先提交到暂存区,被git管理。 本地仓库 保存了对象被提交 过的各个版本,比起工作区和暂存区的内容,它要更旧一些。 git commit 后同步index的目录树到本地仓库,方便从下一步通过

“下游”和“上游”的定义

女生的网名这么多〃 提交于 2019-12-17 19:47:22
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我已经开始玩Git并遇到过“上游”和“下游”这两个词。 我之前见过这些,但从未完全理解它们。 这些术语在SCM( 软件配置管理 工具)和源代码的上下文中意味着什么? #1楼 上游称为有害 唉,另一个使用“上游”,其他答案在这里没有得到,即在回购中引用提交的亲子关系。 Pro Git书中的 Scott Chacon特别容易出现这种情况,结果很不幸。 不要模仿这种说法。 例如,他说合并导致快速发生,因为这发生了 您合并的分支指向的提交直接位于您所在的提交的上游 他想说提交B是提交A的唯一子节点的唯一子节点的唯一子节点,因此将B合并到A中就足以将ref A移动到指向提交B.为什么这个方向应该被称为“上游”而不是“下游”,或者为什么这种纯直线图的几何形状应该被描述为“直接上游”,完全不清楚并且可能是任意的。 (当它说“当前分支头是命名提交的祖先”时, git-merge 的手册页可以更好地解释这种关系。这就是Chacon应该说的那种。) 事实上,Chacon自己似乎后来使用“下游”来表示完全相同的事情,当他谈到重写已删除提交的所有子提交时: 您必须重写6df76下游的所有提交,以从Git历史记录中完全删除此文件 基本上,当他提到随着时间的推移历史时,他似乎并没有清楚地知道“上游”和“下游”的含义。 这种使用是非正式的

Git合并指定文件到另一个分支

跟風遠走 提交于 2019-12-17 12:32:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 经常被问到如何从一个分支合并特定的文件到另一个分支。 其实,只合并你需要的那些commits,不需要的commits就不合并进去了。 合并某个分支上的单个commit 首先,用git log或sourcetree工具查看一下你想选择哪些commits进行合并,例如: 比如feature 分支上的commit 82ecb31 非常重要,它含有一个bug的修改,或其他人想访问的内容。 无论什么原因,你现在只需要将82ecb31 合并到master,而不合并feature上的其他commits, 所以我们用git cherry-pick命令来做: git checkout master git cherry-pick 82ecb31 这样就好啦。现在82ecb31就被合并到master分支,并在master中添加了commit(作为一个新的commit)。 cherry-pick 和merge比较类似, 如果git不能合并代码改动(比如遇到合并冲突),git需要你自己来解决冲突并手动添加commit。 这里git cherry-pick每次合并过来会显示文件冲突(其实并没有冲突代码部分,只需手动解决既可) 合并某个分支上的一系列commits 在一些特性情况下,合并单个commit并不够,

git rebase 用法小结

笑着哭i 提交于 2019-12-12 12:18:14
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 本文主要参考 https://git-scm.com/docs/git-rebase rebase在git中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。它的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁! 前提:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外) 1.合并多个commit为一个完整commit 当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。 现在我们在测试分支上添加了四次提交,我们的目标是把最后三个提交合并为一个提交: 这里我们使用命令: git rebase -i [startpoint] [endpoint] 其中 -i 的意思是 --interactive ,即弹出交互式的界面让用户编辑完成合并操作, [startpoint] [endpoint] 则指定了一个编辑区间,如果不指定 [endpoint] ,则该区间的终点默认是当前分支 HEAD 所指向的 commit

git合并分支上指定的commit

不想你离开。 提交于 2019-12-12 12:04:55
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> merge 能够胜任平常大部分的合并需求。但也会遇到某些特殊的情况,例如正在开发一个新的功能,线上说有一个紧急的bug要修复。bug修好了但并不像把仍在开发的新功能代码也提交到线上去。这时候也许想要一个只合并指定某些 commit 的功能。 假设分支结构如下: dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master] \ 76cada-62ecb3-b886a0 [feature] 再假设 62ecb3 的提交修复了bug,这时候可以用 cherry pick 合并单个 commit 具体操作: git checkout master git cherry-pick 62ecb3 就这么简单。62ecb3 已经应用在 master 上了(作为一个新的commit)。 cherry pick 连续多个commit cherry pick 虽好,但一次只能合并一个commit。合并多个就要用到 rebase 了。再次假设想要把 76cada 和 62ecb3 合并到 master 上。 操作: git checkout -b newbranch 62ecb3 git rebase —onto master 76cada^ 76cada^ 表示从 76cada 的

如何撤消“git commit --amend”而不是“git commit”

天大地大妈咪最大 提交于 2019-12-11 18:08:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我不小心修改了我以前的提交。 提交应该是独立的,以保留我对特定文件所做更改的历史记录。 有没有办法撤消最后一次提交? 如果我执行 git reset --hard HEAD^ ,第一次提交也会撤消。 (我还没有推到任何远程目录) #1楼 您始终可以从 手册中 拆分提交 使用git rebase -i commit ^启动交互式rebase,其中commit是要拆分的提交。 实际上,只要包含该提交,任何提交范围都可以。 使用“编辑”操作标记要拆分的提交。 在编辑提交时,执行git reset HEAD ^。 结果是HEAD被一个重绕,索引也随之而来。 但是,工作树保持不变。 现在将更改添加到您希望在第一次提交中拥有的索引。 您可以使用git add(可能是交互式)或git-gui(或两者)来做到这一点。 使用现在适当的提交消息提交now-current索引。 重复最后两步,直到工作树干净。 用git rebase继续rebase - 继续。 #2楼 使用 ref-log : git branch fixing-things HEAD@{1} git reset fixing-things 然后,您应该只在您的工作副本中进行所有先前修改的更改,并且可以再次提交 查看以前索引的完整列表,输入 git reflog