Я пытаюсь усовершенствовать личный рабочий процесс git для чего-то, с чем немного легче справиться.Рабочий процесс Git для одного разработчика в локальном репозитории
Вот некоторые фоне того, как я использую Git для целей этого поста:
Один разработчик, который является единственным один работает в хранилище.
Единая копия репозитория, хранящегося на локальном компьютере.
Только две ветви "dev" и "master".
Все работы выполнены на «dev».
То, что я пытаюсь выполнить, чтобы добраться до точки, где только коммиты из филиала «мастера» работает версию производства на основе confrimed стабильного «Dev» код.
Эффективно, что я ищу, чтобы сделать это:
Когда все в «разработчика» протестирован и готов к работе, обновление «мастер», чтобы быть точным клоном филиала «Dev» дерево файлов.
внести незначительные изменения в «мастер» для обновления номеров версий, и т.д. ...
Обязаться обновленной ветви «мастер».
Создайте новый тег из ветки "master".
То, как я приближаюсь первый шаг является проверка филиала «мастер», а затем запустить:
'git diff master dev | git apply -'
Насколько я понимаю, это эффективно сдувает ничего «мастера "и заменяет все дерево содержимым" dev ". Выполнение «git status» показывает, что это делает то, что ожидается на основании № 1 выше.
Итак, первый вопрос: Верно ли это?
После того, как филиал «master» получил эти обновления, я запустил свой сценарий для обновления номеров версий в файлах. Затем я просто запускаю стандартный «git add». и «git commit -a», чтобы добавить все изменения. Наконец, я создаю новый тег и возвращаюсь в ветку «dev», чтобы снова начать кодирование.
Итак, другой вопрос: Есть ли что-нибудь в этом процессе, которое вызовет проблемы?
ОБНОВЛЕНИЕ: Я должен был поставить это в первый раз, но причина, по которой я не просто использую слияние, заключается в том, что изменение номера версии на главном, а затем попытка слиться с изменениями в dev вызывает конфликты слияния. Я знаю, что они неактуальны, но он все еще останавливает процесс. Я использовал «merge -Xtheirs {branch}», прежде чем заниматься этим, но я не уверен в этом.
UPDATE2: Вот некоторые вещи, которые я знаю, не работают.Я собрал сценарий bash, который работает на Mac OSX. Первая попытка использовать слияние:
#!/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
Другой путь я попытался это с -Xtheirs, который выглядит, как он работает в первый, но не обновлять все. Для того, чтобы увидеть, что удалить последние несколько строк после перерыва выше, и заменить их:
### 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
Там нет никаких конфликтов, но «выход-мастер-test1-c.txt» показывает «ВАРИАНТ-2,0» вместо Желательно "VERSION-XXX". Это, похоже, произошло потому, что никаких изменений в файле не было. Файл 'output-master-test2-c.txt' имеет ожидаемое значение "VERSION-XXX". Проблема, конечно, в том, что поиск и замена, которые пытались обновить до версии 3.0, пропустили бы в test1-c, потому что он не узнал бы 2.0 часть жалобы VERSION.
Я должен был поставить это в оригинале, но проблема, с которой я сталкиваюсь с слиянием, всегда связана с конфликтом, который необходимо решить. Я считаю, что это связано с тем, что я изменяю номер версии в master после того, как она перешла из dev. Итак, когда приходит стандартное слияние, он видит это и жалуется. Чтобы пройти и справиться с этим, я пытаюсь избежать. Я просто хочу, чтобы это сработало, и я бы предпочел сохранить мастер в курсе. (Хотя мне нужно больше думать о том, чтобы иметь только теги, сделанные из ветки выпуска tmp, как вы предлагаете.) –
P.S. в старом процессе, где у меня была промежуточная ветка, я использовал «git merge --no-ff -Xtheirs». Но я точно не знаю, как это работает. –
Подход релизной ветви, о котором я упоминал во второй части моего ответа, позволит вам избежать конфликтов. –