Як я можу натиснути певну комісію на віддалений, а не попередній комітет?


827

Я зробив кілька комітетів у різних файлах, але поки що я хотів би перенести до мого віддаленого сховища лише певну комісію.

Це можливо?


6
можливий дублікат git: push єдиний
фіксатор

Дивіться хорошу техніку тут: stackoverflow.com/a/1789142/1579667
Benj

Відповіді:


1087

Для того, щоб підштовхнути вгору через даність здійснювала, ви можете написати:

git push <remotename> <commit SHA>:<remotebranchname>

надано <remotebranchname>вже існує на пульті. (Якщо цього немає, ви можете використовувати його git push <remotename> <commit SHA>:refs/heads/<remotebranchname>для автоматичного створення.)

Якщо ви хочете натиснути на комісію, не натискаючи на попередні зобов’язання, спершу слід скористатися, git rebase -iщоб повторно замовити коміти.


66
git push <remotename> <commit SHA>:<remotebranchname>працює. хитрість полягає в тому, щоб поєднати його з тим, git rebase -iщоб перемістити
комісію,

29
Ще одна гарна порада - переконайтесь, що ви скопіювали SHA зобов’язання, яке ви хочете натиснути після виконання цього ребайна -i, а не раніше, як я щойно зробив :)
estan

33
Майте на увазі, що це не вдається, якщо віддалена гілка ще не існує. Створення гілки можна за допомогою git push <remotename> <commit SHA>:refs/heads/<new remote branch name>. Після цього натисніть так, як описується відповідь.
Wes Oldenbeuving

32
Наприклад, натиснути все, крім останнього, виконувати деякі стандартні імена git push origin HEAD~1:master.
невгамовний шум

3
Також зауважте, що якщо ви вже натиснули пізніший SHA на цю віддалену гілку, вам потрібно буде змусити натиснути цю. Використовуйте -fпрапор.
Ian Vaughan

79

Інші відповіді відсутні у описах переупорядкування.

git push <remotename> <commit SHA>:<remotebranchname>

підштовхне одну комісію, але ця комісія повинна бути СТАРІШОЮ з ваших локальних, не наштовхуваних, зобов’язань, не плутати їх з першими, першими чи підказками, які, на мою думку, є неоднозначними описами. Здійснювати зобов’язання слід за найстаріший з ваших зобов’язань, тобто найдалі від останнього. Якщо це не найстаріша фіксація, то всі коміти від вашої найстарішої, локальної, не натиснутої SHA до вказаної SHA будуть висунуті. Для впорядкування комісій використовуйте:

git rebase -i HEAD~xxx

Після упорядкування комісії ви можете спокійно перенести його у віддалений сховище.

Підводячи підсумки, я використовував

git rebase -i HEAD~<number of commits to SHA>
git push origin <post-rebase SHA>:master

щоб підштовхнути одну комісію до моєї віддаленої ведучої гілки.

Список літератури:

  1. http://blog.dennisrobinson.name/push-only-one-commit-with-git/
  2. http://blog.dennisrobinson.name/reorder-commits-with-git/

Дивись також:

  1. git: Дублікат виконує після локальної бази даних, після чого витягнути
  2. git: Pushhing Single Commits, упорядкування з базою даних, Duplicate Commits

3
Деякі витоки, можливо, цього не дозволяють. Наприклад, у GitLab я бачу "Вам не дозволяється примушувати push-код до захищеної гілки цього проекту." Що трохи дивно, оскільки я не думав, що я щось змушую, просто роблю звичайний поштовх. Будь-яка ідея, як це зробити без "примушування"?
Ed Avis

1
@Ed Shoudl не буде потреби в натисканні. Здається, у вас є проблема з вашими конкретними налаштуваннями git. Можливо, ви відмовились від віддаленого комітету HEAD? Я не знаю, що таке захищена гілка, це здається проблемою дозволу.
Самуїл

1
Самуель - це було б сенсом, але git rebase - я показує лише місцеві комісії, які пізніше віддаленої HEAD, тому я не знаю, як я міг би це зробити.
Ед Авіс

1
Самуель - дійсно, я можу робити часткові поштовхи зараз, тому я не знаю, що пішло не так, але, мабуть, намагався так чи інакше підштовхнути комісію, не отриману від віддаленої ГОЛА.
Ед Авіс

1
@Ed Ви сказали, що "git rebase - я показує лише місцеві комісії, які пізніше віддаленої HEAD", я не думаю, що це правда. Я протестував і зміг відновити базу даних віддаленої ГОЛОВИ.
Самуїл

25

Я б запропонував використовувати git rebase -i; перемістіть зобов’язання, яке ви хочете натиснути, на верхню частину укладених вами зобов’язань. Потім скористайтеся, git logщоб отримати SHA скасованого комітету, перевірте його та натисніть на нього. Перезавантаження забезпечить, що всі ваші інші зобов’язання тепер є дітьми того, кого ви натиснули, тому майбутні поштовхи також спрацюють нормально.


3
Не могли б ви дати хід повним прикладом esp. знову git logкрок?
Друкс

4
Скажімо, у вас є 3 відносно незалежні комісії з повідомленнями "A", "B", "C", здійсненими в такому порядку, і ви хочете натиснути "B". 'git rebase -i' повинен отримати вас та редактора, перелічивши всі три; перемістити B вгору і зберегти / кинути. 'git log --pretty = oneline -n3' відображатиме список B, A, C з хешами перед кожним повідомленням, а B тепер останнім. 'git checkout -b temp $ hash_of_B; git push 'у цьому пункті повинен натиснути B. Тоді ви, ймовірно, захочете 'git checkout -b master; git branch -d temp ', щоб повернутися до попереднього стану, припускаючи, що ви перебуваєте у вашій місцевій головній гілці; замінити відповідно.
Вальтер Мундт

1
+1 Ви коли-небудь стикалися з "гнівом богів-git" після rebase-push-rebase? (Можливо, це трапиться також випадково, правда?)
Drux

2
Якщо ви уважно читаєте мою відповідь, ви бачите, що натискання відбувається лише після повторної бази даних, а перезавантажена комісія переміщується лише над іншими комітетами, які ще не були висунуті. Після того, як компрес буде висунутий, його, як правило, слід вважати встановленим в камені; залиште його в спокої в майбутньому випуску. Ця методика лише для того, щоб ви могли впорядкувати кілька локальних змін у гарному порядку, перш ніж натискати на них. Якщо ви відстежили налаштування правильно, 'git rebase -i' без жодних інших аргументів за замовчуванням навіть не відображатиметься, що ви натиснули коміти, тому безпечніше від нещасних випадків, ніж деякі інші методи.
Вальтер Мундт

21

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

Спосіб зробити це:

Створіть нову філію -

git branch <new-branch>

Оновіть свою нову філію своїм початковим відділенням -

git fetch

git rebase

Ці дії гарантують, що у вас точно такі самі речі, як у вашого походження.

Вишні виберіть те, sha idщо ви хочете натиснути -

git cherry-pick <sha id of the commit>

Ви можете отримати sha id, запустивши

git log

Додайте його до свого походження -

git push

Біжіть, gitkщоб все виглядало так, як ви хотіли.


2
Використання git rebase -iбуде ідеальним рішенням, як пропонується у вищезазначених рішеннях. Вишневий вибір потрібно використовувати лише тоді, коли ви хочете дублювати коміти.
Vinay Bhargav

13

Я вважаю, що вам доведеться "повернути назад" до цього перекладу, а потім підштовхнути його. Або ви можете cherry-pickскористатися новою гілкою та натиснути її на гілку у віддаленому сховищі. Щось на зразок:

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 # From the other branch
git push origin {branch}

9
повернення git - це погана ідея - це створює нове зобов’язання
жовтня

1
@hasen: Тоді ви можете просто виконати потрібне cherry-pickзобов'язання.
Джош К

4
і повернення, і вишня - це погані ідеї. git rebase -i ваш друг тут, див. відповідь Вальтера Мундта нижче.
Nicolas C

3
@Nicolas, чому вишня вибирає погану ідею?
Антуан

3
@Antoine, як правило, ви хочете, щоб ваша філія залишалася синхронізованою з тією, яку вона відстежує за походженням. Якщо ви вибираєте вишню, ви робите копію / вставку, і вам доведеться в якийсь момент зіткнутися з не надісланою копією. Якщо ви перезавантажуєте -i, ви робите "вирізання та вставлення" і тримаєте свою гілку в синхронізації з пультом до того місця, де ви хочете.
Nicolas C

0

Ви також можете в іншому каталозі:

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