最佳实践:想要使用git部分提交提交

时间:2014-06-10 15:42:48

标签: git version-control

我负责部门网络服务器,它有很多小的单页模块(大多数只显示动态生成的报告),还有一些较大的模块由5-20个不同的html页面组成。几乎所有这些都是在perl中完成的,在这里和那里都有一些java助手。

只有两台服务器:生产服务器和我的开发服务器,并且不太可能添加第三台服务器。但是该部门想要快速的周转时间,所以当有人来我办公室询问“你能否在过去的12个月内生成报告中有多少foos”时,他们希望这个网页在一小时或2小时后投入生产。所以我们没有复杂的构建和部署过程 - 通常,我在我的开发服务器上构建页面,在开发服务器上测试它,git commitgit push,并{{1}它在生产上。这适用于所有人。

现在我的问题是,当我在一个更大的项目上工作时,我想使用git进行我的更改,即使我不想让它们生效。同时,我希望能够中断更大的项目,完成一项小任务,提交推送小任务,并从拉动中省略大项目文件。例如,

git pull

然后

git commit -m "First attempt, not finished yet" bigproject/file1 bigproject/file2

然后将git commit -m "reversed foo and bar" smallfix/file3 ,而不是file3file1拉到制作中。

据我了解git,标签对我没有帮助,因为我只能拉“标签之前的所有东西”,而分支也没有多大帮助,因为我必须承诺一切,改变分支,在那里做一些工作,再次提交所有内容,然后改回来 - 我需要在触摸某些代码之前始终知道我想要处理哪个分支。

所以现在,我在同一台机器上使用两个沙箱,一个用于短期工作,另一个用于长期工作,但我怀疑这是解决问题的最佳方法。那么我如何“正确”/使用git?

3 个答案:

答案 0 :(得分:3)

听起来分支正是你想要的。查看Git Flow(http://nvie.com/posts/a-successful-git-branching-model/)。

听起来你正在描述的是想要进行长时间运行的开发,直到它准备好之后才能部署,但不会因为这些更改而阻止发布更多代码。 Git Flow(和其他分支策略)通过将一个功能分支合并回主开发分支,然后再发布一个主分支来解决这个问题。值得一读的文章是关于每一个的优点,但是一个简短的演练将是:

  1. 我为big-project-x创建了一个功能分支,它从develop开始分支。
  2. 我在那个项目上工作了一段时间,在我去的时候承诺。
  3. 鲍勃参与了一个说法"我需要报告Y",所以我创建了一个report-y功能分支,它来自于开发并且不包含任何big-project-x变化。
  4. 我完成report-y,合并回develop,然后将这些更改推送到服务器。
  5. 为了让我的生活更轻松,我将合并发展为big-project-x,以便它获得最新的更改。
  6. 一段时间后,我完成big-project-x,将其合并到develop,然后推送到服务器。
  7. 庆祝!
  8. 为了解决您提到的一些缺点:

    1. Git提交很便宜,所以如果你转而使用别的东西,那么无论如何都应该提交。
    2. 如果您已完成大量更改,然后意识到您处于错误的分支上,那么您可能只需git checkout branchname然后提交,但如果存在冲突,您可以使用git stash,然后使用git checkout branchname,然后使用git stash apply。 Stash是一种在短时间内存储变化的好方法。
    3. 通常需要一点点严谨来养成分支的习惯,但是一旦你习惯了它,你就会真正看到Git及其轻量级分支模型的强大功能。显然你需要付出一些努力来确保长期运行的分支机构不会过时(经常从开发中合并),但这是我建议用于管理快节奏和慢节奏开发的最简单方法相同代码库中的项目。

答案 1 :(得分:1)

另一种方法是拥有两个分支 - 比如,生产和开发用于开发目的的硕士。您在开发分支上完成所有工作,当您需要生产中的某些内容时,可以使用cherry picking选择包含所需更改的提交。

在问题中描述的特定情况下,如果我们调用第一个提交A和第二个提交B,那么这两个都将在develop分支中完成。然后,当你想让B投入生产时:

git checkout master
git cherry-pick B
git push

然后像以前一样继续您的工作流程,确保生产服务器位于主分支上。

答案 2 :(得分:0)

@ Spikeheap的回答帮助我意识到在切换分支之前我不需要清理,这意味着分支正是我所需要的。

总结一下,这是我的工作流程,以及必要的git命令,以防有人需要类似的设置:

要使用的命令:

  • 在每次提交之前,要查看我所在的分支,以便我不会犯错误

    git branch

  • 确定哪些文件已更改:

    git status

  • 决定一些更改应该进入与我所在的分支不同的分支。这可以在更改后完成:

    如果分支已存在,则

    git checkout <branch>

    git checkout master && git checkout -b <branch>如果是新的

    git commit

  • 如果git checkout <branch>给我一个冲突:

    git stash

    git checkout <branch>

    git stash apply

  • 退出,如果我已经提交错误的分支(但尚未推送):

    git reset --hard HEAD~1

  • 推送当前分支:

    git push -u origin <branch>

  • 当我完成更大的补丁时,将分支合并为主分支:

    git checkout master

    git merge <branch>

  • 当我意识到在创建一个其他开发分支而不是master之前创建了一个新分支,然后再向其提交内容:

    git checkout master

    git branch -d <branch>

    git checkout -b <branch>

  • 当请求快速修复时,我想首先在开发服务器上进行测试:

    在开发服务器上

    git checkout master

    <edit files, test>

    git commit -m <hotfix desc> <changed filenames>

    git push

    git checkout <the branch i was working on before>

    git merge master

    在prod服务器上:

    git pull

  • 当我直接在prod服务器上实施一些低风险的变更时:

    在prod服务器上:

    git commit -m <hotfix desc> <changed filenames>

    git push

    在开发服务器上

    git checkout master

    git pull

    git checkout <the branch i was working on before>

    git merge master

说明:

  • 无论在哪里

    git commit <filenames>

    您也可以使用

    git add filename1

    git add filename2

    git commit

  • 只要同时在不同的分支中没有文件被更改,我就可以在分支(git checkout <branch>)之间跳转而无需提交或清理。