4

我需要一些关于将我的开发分支合并到主分支的建议。另请注意,我正在使用 Git 扩展,因此请尽量避免使用过多的命令行术语。

假设我在dev分支上进行了 3 次提交(我目前仍将其签出,并且在我分支之后, mst分支有 1 次提交。

dev:    1 ---> 2 ---> 3
       /
      /
mst: 0 --- X

现在我想将我的dev分支合并到mst分支中,但实际上我只想合并提交 1 和 2。

我的理解是,我需要检查mst(为任何正在进行的工作预先存储或临时提交)并将mst与提交 2 合并。

dev:    1 ---> 2 ---> 3
       /        \
      /          \
mst: 0 --- X ---- 4

现在,提交 3不同步,所以接下来要做的是重新同步dev分支。为此,我需要检查dev并将devmst合并或 rebase devmst

IE。

dev:     1 ---> 2 ---> 3 --- 5
        /        \          /
       /          \   ------
      /            \ /
mst: 0 ---- X ----- 4

或者

dev:    1 ---> 2     5
       /        \   /
      /          \ /
mst: 0 --- X ---- 4

与其他开发人员不太满意的主要问题是合并可能会浪费大量时间,因为

  1. 您需要“保存”您当前的工作,然后 checkout mst然后返回 checkout dev (我们使用的是 VB6,因此我们还需要关闭并重新打开 VB6 以重新加载文件,因为潜在的合并冲突和 VB6 无法识别外部修改过的文件)
  2. 双重合并过程(一个更新 mst另一个重新同步 dev

此外,我在 stash 方面遇到了一些可靠性问题(有时 stash pop 会阻止我弹出),这就是为什么我建议我的开发人员同事进行临时提交(在提交 3 之后),然后在最后进行混合重置.

我们是一家小公司,所以尽快把事情做好是当务之急(但我们不能把所有事情都推出来,因为有些事情会被推迟)。真的需要这么多步骤,还是有更快的方法?

4

4 回答 4

1

使用分支

正如评论中所建议的,最简单的方法是在第二次提交之后创建一个新分支(如,在您开始处理提交 #3 的更改之前)。

如果你这样做,无论你做什么进一步的工作,你都会有一个干净的合并点。

您的工作流程似乎受到先前使用集中式 vcs 的经验的影响。仅仅因为你的权威仓库上有一个分支'master'(mst)或'develop'(dev)并不意味着你必须将它们称为相同的,或者需要一对一的对应关系。

我觉得在 git 中,创建短期分支(无论名称)通常更容易,然后在推送到您的公共或权威 repo 时简单地合并适当的分支。

于 2013-02-18T10:42:02.733 回答
0

你使用的是什么工具?我为 github 使用 Mac 客户端:

http://mac.github.com/

使用这个出色的工具,对我来说,分支、合并、更改分支只需 30 秒的操作。当然,你工作的抽象级别相当高,但对于日常使用,这正是我所需要的。

它也有一个 windows 版本,但我没有使用过,也不知道那里是否存在任何限制:

http://windows.github.com/


主要有3个级别的源码管理工具:

1) VSS 样式阻止结帐:这是这样做的历史方式。如果您有一个或多个不同时处理相同文件的开发人员,这可能对您有用。

2) SVN 风格的非阻塞结帐:所有开发人员都在一个中央仓库上工作,但他们可能同时在同一个文件上工作。如果存在冲突,则需要在提交前解决(更新/提交前解决)

3) Git 风格的分布式 SCM:当您的开发人员在较长时间内使用本地存储库进行独立开发时,这会带来最大的价值。一旦他们对结果感到满意,他们可能会决定将他们的更改发布到父仓库。主要用于开源开发。

您需要选择最适合您的开发风格的模型。对于大多数拥有紧密合作团队的商业组织来说,SVN 模型的效果相当不错。如果你有更复杂的开发团队,Git 可以帮你处理。

于 2012-07-15T01:36:27.723 回答
0

Git 需要在合并操作期间使用工作目录和索引,因为您需要它们来解决出现的任何合并冲突。

如果您需要在进行合并时将工作目录保持在脏状态,那么您可以使用您的主要本地存储库作为源来创建一个克隆的存储库。然后在克隆中进行所有合并,并将更改取回主存储库

您可以使用 Git Extensions 进行克隆,也可以使用以下命令:

cd C:\Users\Basewq\Code
git clone MyProject MyProjectForMerging

然后,当您想在不中断工作目录的情况下进行合并时,将更改从 MyProject 拉入 MyProjectForMerging,进行合并,然后将提交取回 MyProject(警告:不要将更改推送到 MyProject,始终获取/拉取)。同样,您可以使用 Git 扩展,也可以使用命令行:

cd C:\Users\Basewq\Code\MyProjectForMerging
git checkout mst
git pull
git merge dev

并将更改带回您的主存储库:

cd ..\MyProject
git fetch ..\MyProjectForMerging

现在提交将在 MyProject 存储库中,准备好被推回原点或任何地方。如果需要,您还可以从 MyProjectForMerging 推送到任何其他遥控器。

于 2012-07-15T07:46:54.210 回答
0

Git 需要在合并操作期间使用工作目录和索引,因为您需要它们来解决出现的任何合并冲突。

如果您在进行合并时需要将工作目录保持在脏状态,那么您可以告诉 Git 临时使用替代工作目录和索引。但是,这需要命令行,可能会造成混淆。

目标是创建一个临时索引文件和一个临时工作目录。将 Git 指向它们,进行合并,然后恢复正常的索引和工作目录。

:: Create a temporary working directory, but use my normal repository

mkdir C:\Temp\MyProject
set GIT_DIR=C:\Users\Basewq\Code\MyProject  -- (path to my normal repo)
set GIT_INDEX_FILE=C:\Temp\index
set GIT_WORK_TREE=C:\Temp\MyProject

:: Now do the merge in C:\Temp\MyProject

git checkout mst
git merge dev

:: Now put everything back

set GIT_DIR=
set GIT_INDEX_FILE=
set GIT_WORK_TREE=
del C:\Temp\index
rd /q /s C:\Temp\MyProject
于 2012-07-15T08:04:41.387 回答