Обновіть один Git-коміт


116

Чи є спосіб перенести один комітет з гілки на іншу гілку?

У мене така галузева структура:

-- -- -- -- -- (Master)
            \
              -- -- -- -- -- XX (Feature-branch)

Все, що я хочу зробити, - це перезавантажити останню фіксацію Feature-branchна master та відкат на Feature-branchодин комітет.

-- -- -- -- -- XX (Master)
            \
              -- -- -- -- -- (Feature-branch)

Як це зробити?


3
Якщо ви можете перезавантажити будь-яку кількість комітетів, то чому ви запитуєте про повторне використання одного? Якби я міг задати питання в SO, я би запитав, в чому різниця між rebasing (однократним комітетом) та вишністю.
Val Val

9
Тому що я не знав, що збирання вишень існує, і я роблю "Фаф про гілку", "Отримайте запит на виправлення на іншій гілці", "Виправте", "Зверніться на неправильну гілку", "D'OH!" достатньо, щоб задати питання було корисно.
Кевін Мейєр

Відповіді:


116

Можна освоїти вишню XX для майстра.

git checkout master
git cherry-pick <commit ID of XX>

І видаліть останню фіксацію з гілки функції за допомогою скидання git.

git checkout Feature-branch
git reset --hard HEAD^

64
як питання, яке спеціально називається "git rebase ...", має прийняту відповідь, ніж містить вишневий перебір, який є абсолютно іншим поняттям і часом сам по собі вважається нечистим?
Бондакс

1
Не впевнений, що це актуально, але команда, яку я хотів відновити, мала деякі файли, які були переміщені, і cherry-pickвони видавали їх так, ніби вони були видалені зі старого місця та створені в новому місці. Я вважаю, що база даних би подбала про це, але до цього часу я просунувся вгору, тому я не можу це перевірити. У будь-якому випадку, будьте обережні, якщо у вас схожа ситуація.
waldyrious

Примітка: щоб підштовхнути зміни Feature-branchдо походження, вам потрібно буде зробити так, git push -f origin Feature-branchяк ваш Feature-branchтепер вважається на 1 комітку за origin/Feature-branch.
jojo

1
Яка практична відмінність цього рішення від рішення CharlesB ?
Лій

96
git rebase --onto master branch~1 branch 

Це говорить про "відновлення діапазону комітетів між останньою перед гілкою та гілкою (тобто XX фіксацією) на кінчику головного відділення"

Після цієї операції branchнаконечник переміщується на фіксацію XX, тому ви хочете встановити його назад

git checkout branch
git reset --hard branch@{1}^

Що говорить: "скиньте кінчик гілки до комісії перед попереднім станом"

Тож вибір вишні - простіше рішення ...


5
Це, здається, не працює для мене, я втрачаю комітети до XX, і гілка відновлюється для того, щоб засвоїти одну комісію, але я ніколи --ontoраніше не використовувалась, тому я можу робити щось не так. До речі, ОП заявила, що це база, але, схоже, він хоче зробити вишню.
тев

1
моя помилка, база даних дійсно переміщує гілку на майстер, її потрібно скинути
CharlesB

1
Яка практична відмінність між цим рішенням та рішенням через twee ?
Лій

1
@Lii єдине, що я бачу, це те, що він використовує 3 кроки замість 4
CharlesB

52

Насправді це досить просто. Рішення полягає в тому, щоб зробити інтерактивну базу даних і "скинути" всі документи, які ви не хочете включати в ребазу.

git rebase -i <target_branch>де target_branchзнаходиться гілка, на яку ви хочете відновити базу даних

Тоді ви редагуєте відкритий файл, а pickтакож зобов’язання, які ви хочете, і drop(або dкоротко) всі зобов'язання, які ви не хочете взяти з собою.


6
ІМО набагато краще рішення, і воно фактично вирішує питання.
ГабріельОширо

Це має бути прийнятим рішенням, враховуючи, наскільки воно загальне, інтуїтивне та коротке.
Пабло Аріас

1

@Charles відповідь правильна. У будь-якому разі я стільки разів використовував це, найбільше для відновлення конкретного конфігурації проекту

  * a8f9182 (HEAD -> виробництво) виробнича конфігурація
  | * конфігурація передпродукції daa18b7 (перед)
  | /  
  | * d365f5f (локальна) локальна конфігурація
  | /  
  * 27d2835 (dev) дивовижна нова функція, яка врятує світ
* | 56d2467 (майстер) нудний стан техніки для проекту
| /

що я створюю для нього нову команду:

$ cat ~ / bin / git-rebaseshot 
COMMIT = $ 1
DEST = $ {2: -HEAD}
git rebase $ {COMMIT} ^ $ {COMMIT} - до $ DEST

як правило, ви хочете автоматично заповнити імена гілок для цієї команди, тому додайте її до цієї функції (додавши до .bashrc або .profile):

_git_rebaseshot () 
{ 
    __gitcomp_nl "$ (__ git_refs)"
}

git autocomplete буде шукати його

Ви можете використовувати цю команду так:

# rebase config on prepro on actual HEAD
$ git rebaseshot prepro 
# rebase config on local onto dev
$ git rebaseshot local dev
# rebase production config on master
$ git rebaseshot pro master

Якщо правильно розділити функції, можливості нескінченні.

* a8f9182 (HEAD -> postgres) BBDD config
* a8f9182 (локальна) локальна конфігурація
* Конфігурація рівня журналу a8f9182 (налагодження)
* a8f9182 (dev) нова функція
|

Я думаю, це те, що люблять робити ковдри .

ця команда буде працювати в будь-якому випадку з будь-яким шагом / ref ви надаєте:

$ git rebaseshot <Feature branch> master
$ git rebaseshot <commit of XX> master

// Чи можете ви зв’язатись із яким-небудь проектом, де ми можемо бачити це в дії?
Натан Басанес

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

//, я зіткнувся з деякими проблемами. Я спробую ще раз.
Натан Басанес

0

Ось ще один варіант:

  1. Переконайтеся, що у вас є пульт із копією гілки функцій
  2. Видаліть локальну гілку функції
  3. Створіть і оформіть нову гілку з такою ж назвою, як і стару гілку функції, яку ви тільки що видалили з майстра
  4. Виберіть вишневий комітет із віддаленої копії потрібної гілки.

Команди виглядають так:

git checkout Feature-branch
git push -u origin HEAD
git checkout master
git branch -D Feature-branch
git checkout -b Feature-branch
git cherry-pick HASH-OF-XX

Це не команда rebase ні, але це відновлення за духом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.