Git本地存储库上的单个开发人员的工作流程

Ala*_*ith 6 git workflow git-diff

我正在尝试将个人git工作流程改进为更容易处理的东西.

这里有一些背景知道我如何使用git作为这篇文章的目的:

  • 单个开发人员是唯一一个在存储库上工作的开发人员.

  • 存储在本地计算机上的存储库的单个副本.

  • 只有两个分支"开发"和"主人".

  • 所有工作都在"开发"完成.

我想要完成的是达到这样的程度,即对"master"分支的唯一提交是基于完整的"dev"代码的工作生产版本.

实际上,我要做的是:

  1. 当"dev"中的所有内容都经过测试并准备就绪时,请更新"master"以成为"dev"分支文件树的精确克隆.

  2. 对"master"进行微小修改以更新版本号等...

  3. 提交更新的"主"分支.

  4. 从"主"分支创建一个新标签.

我接近第一步的方法是签出"master"分支,然后运行:

'git diff master dev | git apply -'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这有效地吹走了"master"中的任何内容,并用"dev"的内容替换整个树.运行"git status"似乎表明这正在做出基于上面#1的预期.

那么,第一个问题:这是正确的吗?

在"master"分支收到这些更新后,我运行我的脚本来更新文件中的版本号.然后,我只运行一个标准的"git add".和"git commit -a"添加所有更改.最后,我创建一个新标签并返回"dev"分支再次开始编码.

那么,另一个问题:该过程中是否存在导致问题的任何问题?

更新:我应该在第一次使用它,但我不是简单地使用merge的原因是更改master上的版本号然后尝试与dev中的更改合并会导致合并冲突.我知道它们无关紧要,但它仍然会阻止这个过程.我之前使用过"merge -Xtheirs {branch}"来处理它,但我也不确定.

更新2:这里有一些我认识不起作用的东西.我已经整理了一个适用于Mac OSX的bash脚本.第一个尝试使用合并:

#!/bin/bash -x

####################
### file: merge1 ###
####################

### clear out the old stuff so you can rerun
rm -rf .git
rm *.txt

### setup the repository
git init

### ignore merge and output files for clarity sake
echo -e "output*\nmerge*" > .gitignore
git add .gitignore

### make the intial commit and move over to dev
git commit -m "Initial commit"
git checkout -b dev

### add stuff to test1.txt in dev
echo -e "FILE1 LINE\nVERSION-XXX\nFILE1 LINE" > test1.txt
echo -e "File2 LINE\nVERSION-XXX\nFILE2 LINE" > test2.txt

### add the files and commit
git add .
git commit -m "Created test1.txt and test2.txt in dev."

### output the state of test1.
cat test1.txt > output-dev-test1-a.txt
cat test2.txt > output-dev-test2-a.txt

### move to master and do a first merge which will work
git checkout master
git merge dev

### Update the version numbers in master and commit it
sed -i "" -e 's/VERSION-XXX/VERSION-1.0/g' test*.txt
git commit -am "Updated version to 1.0 on master"

cat test1.txt > output-master-test1-a.txt
cat test2.txt > output-master-test2-a.txt

### switch back to dev and commit an update to test1.txt
git checkout dev
sed -i "" -e 's/LINE/CHANGED/' test*.txt
git commit -am "Updated content in test*.txt on dev"

### dump test1.txt for reference.
cat test1.txt > output-dev-test1-b.txt
cat test2.txt > output-dev-test2-b.txt

### swtich back to master
git checkout master

######################################################################
### BREAK
######################################################################

### this is where the merge fails because of a conflict
git merge dev
Run Code Online (Sandbox Code Playgroud)

我尝试这种方法的另一种方式是使用-Xtheirs,它看起来最初有效,但它不会更新所有内容.要看到这一点,请在BREAK之后删除最后几行并将其替换为:

### merge with -Xtheirs works here. Proper version "XXX" is showing.
git merge -Xtheirs dev

### but if we update the version number one more time on master
sed -i "" -e 's/VERSION-XXX/VERSION-2.0/g' test*.txt
git commit -am "Updated version to 2.0 on master"

### dump reference file
cat test1.txt > output-master-test1-b.txt
cat test2.txt > output-master-test2-b.txt

### Now, go back to dev and change something in only one of the files
git checkout dev
sed -i "" -e 's/CHANGED/ALTERED/g' test2.txt
git commit -am "Altered only test2.txt on dev."

cat test1.txt > output-dev-test1-c.txt
cat test2.txt > output-dev-test2-c.txt


### are finally return to master and merge again
git checkout master
git merge -Xtheirs dev

### dump reference file
cat test1.txt > output-master-test1-c.txt
cat test2.txt > output-master-test2-c.txt
Run Code Online (Sandbox Code Playgroud)

没有冲突,但'output-master-test1-c.txt'显示'VERSION-2.0'而不是'VERSION-XXX'.这似乎发生了,因为文件没有变化.'output-master-test2-c.txt'文件具有预期的'VERSION-XXX'标记.当然,问题是尝试更新到版本3.0的查找和替换会在test1-c中遗漏,因为它无法识别VERSION sting的2.0部分.

Ada*_*tek 7

你应该使用真正的合并而不是diff/apply hack.这很简单

[master]$ git merge dev
Run Code Online (Sandbox Code Playgroud)

当您在主分支上运行它(在提示中显示)时,您将合并来自dev的所有更改.之后,您可以更新版本号,提交并创建标记

[master]$ git commit -a -m "New version number."
[master]$ git tag version-1.x
Run Code Online (Sandbox Code Playgroud)

就这么简单.

实际上你根本不需要主分支,你可以创建一个基于dev的短期发布分支,在那里创建一个标签,然后删除分支.

[dev]$ git checkout -b release dev
[release]$ git commit -a -m "New version number."
[release]$ git tag version-1.x
[release]$ git checkout dev
[dev]$ git branch -d release
Run Code Online (Sandbox Code Playgroud)