2010-01-19 5 views
1

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

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

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

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 

Edit: я должен прояснить, что каждый номер фиксации.

+0

Когда я был знаком с git и попал в аналогичные ситуации, я обнаружил, что «gitk -all» очень полезен для того, чтобы видеть, как связаны коммиты и ветви, а также выполнять некоторые операции с графическим интерфейсом. – ndim

+0

Это был не тот факт, что мне нужно было визуально видеть отношения (любовь gitk - all & tortoisegit, чтобы визуализировать вещи кстати), но я предположил, что для фиксации 1, 2 и 3 нужно быть на ветке * aBranch *, I должен * начинать * с * aBranch *, делая фиксацию 1 (надеюсь, у меня есть смысл кому-то :). Теперь я понимаю, насколько глупо это. –

ответ

6

Да , это возможно, а не сложно. Краткая версия: 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 и снова начали работать над ним.

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

+0

Несколько полезных ответов на выбор. Я взял на себя смелость выбрать первый хороший ответ, который появился. Спасибо всем, ребята. –

+0

Брайан, я случайно нажал на нижний нисходящий значок принятого ответа. Я не могу отменить это (возможно, сброс git поможет). Извини за это. –

+0

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

1

Отъезд git-stash.

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

+1

Это просто помогает для одного набора изменений, которые еще не были выполнены ... –

0

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

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

+0

+1 сладкий, особенно, если вы знаете, я тоже пробовал меркуриализировать. Я все еще между промежутками между git и mercurial, но то, что описывает ссылка, - это именно то, что мне нужно ... в git :) –

+1

В git тоже довольно тривиально. Вам просто нужны 'reset' и' branch', которые находятся в списке общих команд в соответствии с 'git help'. Я не верю, что руководство, с которым вы связались, является особенно точным в сравнении с git. С помощью git вы можете в любое время отсоединить HEAD. Теперь вы находитесь в анонимной ветке. Конечно, найти труднее, чем названный филиал, но и reflog и 'git fsck' позволят вам найти старые отдельные головы. –

3

Конечно, в этом пункте:

0--1--2--3 master 

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

git branch aBranch 
git reset --hard 1 

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

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

Совершение «4» в этот момент даст:

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

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

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

git branch aBranch 

Вы можете мастер ветер снова совершить 1

git reset --hard <sha1_of_1> 

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

0

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

Это говорит, что вы можете сделать это:

0 - 1 - 2 - 3 мастер - 4 - 5 aBranch

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

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

+0

Вы прямо противоположны, но старые привычки вы знаете ... –

+0

Неправильное. Вы никогда не должны вводить изменения в публичный репозиторий, который возится с историей филиала; но одно из больших преимуществ Git над другими системами заключается в том, что вы можете легко редактировать историю филиалов в своем собственном локальном репозитории, что позволяет легко сделать серию исправлений чистой и понятной, прежде чем отправлять ее для проверки кода. –