(злоупотребляет?) рабочий процесс git - PullRequest
1 голос
/ 19 января 2010

Исходя из Sourcesafe, я в основном использовал git в качестве основной функции отмены. Я склонен работайте в мастер-ветке, долгое время пишите код, делайте коммиты тут и там и двигайтесь дальше.

Пока я программирую свои мозги, мне иногда хочется бросить то, что я делаю правильно сейчас и начать работать над другой функцией. Я знаю, что могу начать новую ветку прямо сейчас, но давайте предположим, что я хотел бы продолжать работать над мастером. Я должен был разветвиться, когда Я начал работать над предыдущей функцией, но это потребовало бы, чтобы я планировал заранее (на этом я ужасен, кстати).

Я уверен, что то, что мне нужно, возможно с помощью git, но я не могу понять вокруг него. Поскольку картинка рассказывает более тысячи слов, схематически это то, что я хотел бы сделать:

0--1 master

0--1--2 master

0--1--2--3 master

0--1--2--3 aBranch    
    \-4    master

0--1--2--3 aBranch    
    \-4--5 master

Редактировать: Я должен уточнить, что каждое число является коммитом.

Ответы [ 6 ]

6 голосов
/ 19 января 2010

Да, это возможно, и не сложно. Краткая версия: git branch aBranch для создания новой ветви, git stash для сохранения любых незафиксированных изменений и git reset --hard 1 для сброса master в фиксацию, которую вы хотели бы, и при необходимости git stash pop, чтобы применить эти незафиксированные изменения к вашей текущей рабочей копии, если они были предназначены для новой ветви master.

Вот полное объяснение с диаграммами, чтобы вы могли следовать за ними. Далее я буду обозначать текущую ветвь (HEAD) с помощью *.

0--1 *master

0--1--2 *master

0--1--2--3 *master

Создать новую ветку aBranch, указывающую на текущий коммит:

$ git branch aBranch
0--1--2--3 *master aBranch

Если у вас есть какие-либо изменения в рабочей копии, которые еще не были зафиксированы, сохраните их с тайником (это важно, так как git reset --hard уничтожит все ваши незафиксированные изменения):

$ git stash
0--1--2--3    *master aBranch
         \- 4 stash

Теперь сбросьте master обратно к ревизии, в которой вы хотите. Я использую 1 ниже в качестве заполнителя; вы можете захотеть использовать SHA-1 или что-то вроде origin/master, если вы хотите сбросить его до версии, в которой находилась ветка master восходящего потока до того, как вы сделали свои коммиты:

$ git reset --hard 1
0--1--2--3    aBranch
   \     \- 4 stash
    \-        *master

Если у вас были незафиксированные изменения в вашей рабочей копии, которые вы спрятали, и вы хотите применить их к master, вы можете использовать git stash apply или git stash pop (apply оставит тайник записанным как коммит ; pop очистит тайник).

$ git stash pop 
0--1--2--3 aBranch
   \-      *master (with stashed changes now back in your working copy)

Теперь вы находитесь на master и сброситесь на коммит 1, именно так, как вы хотели. Новые коммиты попадут в ветку master.

0--1--2--3 aBranch    
    \-4    *master

0--1--2--3 aBranch    
    \-4--5 *master

Обратите внимание, что если ваша рабочая копия чистая (ничего не сообщается git status), вам не нужна команда git stash. Если вы хотите применить свои изменения к aBranch вместо master, вы просто используете git stash pop, когда в следующий раз вернетесь к aBranch и снова начнете работать над ним.

Один важный момент, который следует иметь в виду, заключается в том, что вы должны редактировать историю веток, подобную этой, в своих личных репозиториях, а не в общедоступных, из которых другие пользователи могли бы извлечь. Если вы отправите это в общедоступный репозиторий, из которого люди извлекают данные, им придется перебазировать все свои изменения, и лучше не заставлять их делать это без крайней необходимости.

3 голосов
/ 19 января 2010

Да, это легко сделать в git.

Когда вы сделали коммит 3 на master и поняли, что он должен быть на другой ветви, вы можете просто создать новую ветку на основе текущей позиции.

git branch aBranch

Затем вы можете повернуть мастера обратно, чтобы совершить 1

git reset --hard <sha1_of_1>

и продолжить работу, делая коммиты 4 и 5, как обычно.Они разветвляются из коммита 1, создавая отдельную ветку из aBranch.

3 голосов
/ 19 января 2010

Конечно, на данный момент:

0--1--2--3 master

Выполните следующие команды:

git branch aBranch
git reset --hard 1

Команда git branch создает ветвь в текущем HEAD(таким образом, «master» и «aBranch» относятся к одной и той же точке, но «master» по-прежнему является текущей ветвью), а команда git reset возвращает все обратно в текущей ветви («master»)совершить 1. Тогда вы будете здесь:

0--1--2--3 aBranch    
    \      master

Передача "4" в этот момент даст:

0--1--2--3 aBranch    
    \-4    master
1 голос
/ 19 января 2010

Выезд git-stash .

Редактировать: Если вам нужно вернуться дальше, чем HEAD, вы всегда можете выполнить git checkout , указав начальную точку для получения новой ветви, начиная с любого данного коммита в master.

0 голосов
/ 19 января 2010

Вы должны привыкнуть к ветвлению при каждом запуске новой функции.

При этом вы можете сделать следующее:

0 - 1 - 2 -3 master - 4 - 5 aBranch

Вы не хотите возиться с историей ветки - это вызовет много головной боли.

Всегда развивайтесь на ветке, затем объединяйтесьвернитесь к мастеру и сделайте коммит в SourceSafe.

0 голосов
/ 19 января 2010

Я мало знаю о мерзавцах, и каждый раз мне приходится бороться с чем-то нетривиальным Я использую Mercurial, где то, что вы хотите, довольно просто:

http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/#branching-anonymously

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...