Я пытаюсь уточнить личный рабочий процесс git, чтобы что-то немного легче иметь с ним дело.
Вот некоторые сведения о том, как я использую git для целей этого поста:
Один разработчик, единственный работающий с хранилищем.
Одна копия хранилища, которая хранится на локальном компьютере.
Только две ветви "dev" и "master".
Вся работа выполнена на "dev".
То, что я пытаюсь сделать, это добраться до точки, где единственные коммиты, сделанные в "master" ветке, - это рабочие рабочие версии, основанные на стабильном стабильном "dev" коде.
По сути, я хочу сделать следующее:
Когда все в «dev» протестировано и готово к работе, обновите «master», чтобы быть точнымклон дерева веток dev.
Внести незначительные изменения в "master" для обновления номеров версий и т. Д. *
Зафиксировать обновленную ветку "master".
Создайте новый тег из "основной" ветки.
Способ, которым я подхожу к первому шагу, заключается в извлечении ветки "master" и последующем запуске:
'git diff master dev | git apply -'
Насколько я понимаю, этоэффективно удаляет все что угодно в «master» и заменяет все дерево содержимым «dev».Запуск «git status», кажется, показывает, что он делает то, что ожидалось, на основании # 1 выше.
Итак, первый вопрос: Это правильно?
После того, как ветка "master" получила эти обновления, я запускаю свой скрипт для обновления номеров версий в файлах,Затем я просто запускаю стандартное «git add».и "git commit -a", чтобы добавить все изменения.Наконец, я делаю новый тег и возвращаюсь в ветку «dev», чтобы снова начать кодирование.
Итак, другой вопрос: Есть ли что-то в этом процессе, что вызовет проблемы?
ОБНОВЛЕНИЕ: Я должен был поставить это в первый раз, нопричина, по которой я не просто использую слияние, заключается в том, что изменение номера версии на ведущем устройстве, а затем попытка слияния с изменениями в dev вызывает конфликты слияния.Я знаю, что они не имеют значения, но это все равно останавливает процесс.Я использовал «merge -Xtheirs {branch}» прежде, чтобы иметь дело с этим, но я также не уверен в этом.
ОБНОВЛЕНИЕ 2: Вот некоторые вещи, которые, я знаю, не работают.Я собрал 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, который сначала выглядит так, как будто он работает, но не обновляет все.Чтобы увидеть это, удалите последние несколько строк после 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
Конфликтов нет, но «output-master-test1-c.txt» показывает «VERSION-2.0»вместо «VERSION-XXX», что желательно.Похоже, это произошло потому, что в файле не было никаких изменений.Файл «output-master-test2-c.txt» имеет ожидаемое значение «VERSION-XXX».Проблема, конечно же, заключается в том, что поиск и замена, которые пытались обновить до версии 3.0, будут отсутствовать в test1-c, поскольку он не распознает часть 2.0 строки VERSION.