Как удалить файл из пулл реквеста
обновление Принятый ответ не детализировал шаги в ответе, и в любом случае, github сделал это мертвым простым, так как этот вопрос был задан, поэтому вот шаги:
GitHub теперь поддерживает закрытие pull-запрос
в духе DVCS (как в "Distributed"), вы не отменяете то, что вы опубликовали:
Запросы на вытягивание-это, по сути, патчи, которые вы отправляете (обычно по электронной почте, здесь GitHub webapp), и вы также не отмените электронное письмо;)
но так как система запроса GitHub Pull также включает в себя раздел обсуждения, это было бы там, что вы могли бы выразить свою озабоченность получателю этих изменений, попросив его / ее игнорировать 29 из ваших 30 совершает.
и, наконец, помните:
- a / у вас есть раздел предварительного просмотра при выполнении запроса на вытягивание, позволяющий вам видеть количество коммитов, которые будут включены в него, и просматривать их различия.
- b/ предпочтительно перебазировать работу, которую вы хотите опубликовать, как запрос pull поверх удаленной ветви, которая получит указанную работу. После этого вы можете сделать запрос тяги который смог безопасно быть приложен в быстром переднем образе получатель.
Это, как говорится, с января 2011 года ("Обновленные Обсуждения Запроса Pull"), и упоминается в ответ выше, вы можете закрыть запрос в комментариях.
Посмотрите на эту кнопку "комментарий и закрыть" в нижней части страницы обсуждения:
Если вы отправили запрос на вытягивание в репозиторий, где у вас нет прав на его закрытие, вы можете удалить ветку, из которой возник запрос на вытягивание. Это отменит запрос на вытягивание.
перейдите на вкладку разговора, затем спуститесь туда"закрытие pull-запрос " кнопка там использует эту кнопку для того чтобы закрыть запрос тяги, принимает ref прикрепленного изображения
Я хотел прокомментировать, но поскольку моя репутация не подходит для комментариев, это должен быть ответ. Github на самом деле позволит вам не только отменить запрос тянуть, , но и удалить его просто удалив вилку, которую вы пытаетесь нажать. Надеюсь, это может помочь некоторым другим в этом.
По просьбе tulskiy делаю вольный перевод частей официальной документации GitHub'а Fork A Repo и Send pull requests.
Итак, что же такое «запрос на включение (сделанных вами изменений)» (именно так я перевёл pull request)? В официальной документации гитхаба говорится следующее:
Pull request'ы позволяют вам рассказать другим о тех изменениях, которые вы разместили в своём GitHub-репозитории. Как только pull request отправлен, заинтересованные стороны рассматривают ваши изменения, обсуждают возможные правки или даже добавляют дополняющие коммиты, если нужно.
Говоря своим языком: Посылая pull request, вы говорите автору изначального репозитория (и всем заинтересованным лицам): «Смотрите, что я сделал, не хотите ли принять мои изменения и влить их в проект?»
Немного о моделях совместной разработки
- Модель «Fork + Pull» позволяет любому склонировать (fork) существующий репозиторий и сливать изменения в свой личный fork без необходимости иметь доступ к оригинальному репозиторию. Затем, изменения должны быть включены в исходный репозиторий его хозяином. Эта модель уменьшает количество телодвижений для новых contributors и популярна для open source проектов, так как позволяет людям работать независимо, без единого координирования.
- Модель «общего репозитория» (The Shared Repository Model) чаще встречается у малых команд и организаций, работающих над закрытыми проектами. Каждый в команде имеет доступ «на запись» в один общий репозиторий, а для изолирования изменений применяются тематические ветви (topic branches).
Делаем копию репозитория
Рассматривая первую модель разработки, необходимо иметь свою копию изначального репозитория, в которой и будет вестись работа, и изменения из которой и будут предлагаться затем автору изначального репозитория.
В рамках руководства, будем считать, что мы работаем над репозиторием Spoon-Knife пользователя octocat, а ваше имя пользователя — username.
Сделать это очень просто: на странице репозитория имеется кнопочка «Fork», которую и следует нажать.
После чего, эту свою копию уже можно «стянуть» на свой компьютер:
Склонированный репозиторий имеет одну привязку к удалённому репозиторию, названную origin, которая указывает на вашу копию на GitHub, а не на оригинальный репозиторий, чтобы отслеживать изменения и в нём, вам нужно будет добавить другую привязку, названную, например, upstream.
Делаем работу
Вот, теперь творите добро (и пусть оно будет выражаться в коммитах).
Как только вы сделали работу (или её часть), отправьте её в свою копию репозитория на GitHub:
Возвращаем изменения: Pull request
Итак, всё сделано. Вы написали код, он у вас в ветви feature как у вас на компьютере, так и на GitHub'е. Осталось только «заслать» его в оригинальный репозиторий.
Идите на страницу вашей копии репозитория на GitHub, выбирайте ветвь feature и жмите кнопку Pull Request.
Там же вы можете посмотреть, какие коммиты попали в пулл реквест:
А так же общий diff всех изменений в пулл реквесте:
По умолчанию, пулл реквесты считаются основанными на самой часто интегрируемой ветви родительского репозитория. В этом случае username/Spoon-Knife был скопирован с octocat/Spoon-Knife, так что pull request считается основанным на ветке master репозитория octocat/Spoon-Knife. В большинстве случаев, это будет корректно, но если не так, то вы можете нажать на кнопку «Change Commits»
Вы попадёте в форму выбора базовой и исходной ветвей:
Слева выбираете в какую ветку будут вливаться изменения в родительском репозитории, справа — какие изменения будут браться с вашего репозитория. По примеру: справа octocat/Spoon-Knife/master, слева username/Spoon-Knife/feature. Здесь вы можете указывать не только ветки, но так же теги и id отдельных коммитов в соответствующем репозитории.
ВАЖНО: Договоритесь с владельцем «родительского» репозитория, в какую ветку будете вливать изменения (он может написать это в README)
Изменение базового репозитория меняет и список людей, кто получит уведомление о пулл реквесте. Каждый, кто имеет право «на запись» в базовый репозиторий, получит письмо и увидит уведомление на главной GitHub'а, в следующий раз, как на него зайдёт.
Как только список коммитов вас удовлетворит, нажмите кнопку Update Commit Range.
Когда вы ввели название и описание и перепроверили список коммитов и изменения в файлы, попавшие в пулл реквест, нажмите кнопку Send pull request. Пулл реквест будет создан незамедлительно.
Что дальше?
Следите за вашим пулл-реквестом. Что прокомментируют люди, что скажет мэйнтэйнер, примет или нет ваш пулл реквест.
Помните, я говорил, что следует все изменения, которые пойдут в пулл, держать в отдельной ветке? Так вот, основное удобство: вы всегда можете добавить коммиты к уже существующему пулл реквесту, просто добавив их к этой ветке в вашем репозитории (да-да, просто git push origin feature , при условии, что вы указали в пулл реквесте feature как исходную ветвь)
- Комментарии, оставленные к пулл реквесту;
- Дополнительные коммиты, добавленные к ветви пулл реквеста;
- Комментарии к изменённым строкам или файлам, оставленные к любому из коммитов, включенных в пулл реквест.
Когда ваш pull request примут, не забудьте слить изменения в свой репозиторий (или удалить его, если больше не нужен):
Так же можно удалить ветку, в которой велась разработка:
Что следует делать, если работа заняла большое время и оригинальный репозиторий успел уйти вперёд?
Можно просто влить изменения из оригинального репозитория к себе:
Однако хозяину оригинального репозитория или, может быть, даже вам, не понравится наличие мёрж-коммитов и коммитов из master'а в списке коммитов на пулл. В таком случае вам стоит воспользоваться git rebase.
Прочитать про то, как работает rebase можно в официальном руководстве. Там имеются и очень понятные иллюстрации. Так же есть статья в помощи GitHub.
ВНИМАНИЕ: Пожалуйста, учтите, что git rebase меняет id коммитов! Поэтому, все действия с этой командой стоит выполнять только на локальном репозитории, до того, как эти коммиты станут общедоступны, т.е. до того, как вы их push'нули на гитхаб.
Если вы хозяин: Как принять pull request
Если пулл реквест удовлетворяет всем условиям, то кто-либо с правом «на запись» (т.е. может сделать push) в целевой репозиторий, должен принять pull request одним из многих методов. Ниже описаны три наиболее популярных метода:
Auto Merge (автослияние)
Во многих случаях можно попросить github автоматически принять пулл реквест, используя большую зелёную кнопку Merge Pull Request, которая сама вольёт изменения, создаст мёрж-коммит и закроет пулл реквест.
Подробнее можно почитать в этом хабратопике: Кнопка слияния на GitHub.
Fetch and Merge (скачать и слить)
Основной метод вливания изменений. Он требует добавления remote, ведущего к репозиторию человека, отправившего pull request, скачивания изменений с этого репозитория, объединения нужной ветви, исправления конфликтов и выгрузки обновлённой ветви обратно в исходный репозиторий:
Patch and Apply (пропатчить и принять)
Предыдущий метод работает хорошо, когда вы работаете в команде или постоянно принимаете изменения от одной и той же группы людей. Другой метод немного быстрее в единичных случаях при использовании git-am.
У каждого пулл реквеста есть свой .patch URL, с которого можно скачать текстовый патч, чтобы скормить его команде git-am:
Закрытие пулл реквеста
Запросы на пулл автоматически закрываются, когда запрошенные коммиты вливаются в репозиторий назначения. При этом генерируется событие, информирующее всех участников разработки, что пулл реквест был принят и влит в основную ветвь.
Так же возможно вручную закрыть пулл реквест в случае, если он был отклонён. Иногда это необходимо в случаях, когда изменения были приняты с помощью git-cherry-pick или другого механизма, который не позволяет обнаружить факт слияния (merge).
Собственно запулил в некоторых коммитах файлы которые не должен был пулить. Как их убрать из pull request?
Обычно можно в вашей ветке сделать коммит с amend - поменять последний коммент. Т.е. удалить файлы или ревертнуть. git add. git commit -a, и запушить с форсом git push -f
Спешу обратить внимание что force-push - является признаком дурного тона и сложноразрешимых проблем при мёржах, когда над веткой работает более одного человека. Можете обратиться к цитатам Линуса Торвальдса по этому поводу.
я к нему отношусь как к инструменту. Если в своей ветке, с которой больше никто не работает, я исправляю опечатки, которые не имеют никакой исторической ценности, то ничего плохого я в этом не вижу. Если же работают 2+ человека, то, конечно, делать force push не стоит
Если речь именно об PR, - можете просто сделать новый коммит с удалением этих файлов ( git rm somefile ), а потом сделать squash (склеить ряд коммитов в один, про это можно почитать отдельно) для ветки с этим PR, сделать отдельную ветку, где всё слито в один коммит, где этих файлов уже не будет в истории, а старую ветку удалить и запушить её удаление ( git push --delete origin some_branch_to_remove ).
Обычно все очень просто.
Если история самих коммитов вас не беспокоит +/- один коммит, тогда это можно решить просто добавлением еще одного коммита. В этом коммите удалите эти самые файлы (делать нужно в той самой ветке которую отправили на PR).
Если запушите изменения в ветке. Увидите что коммит автоматически подтягивается в PR.
I have added a local changes to an existing file into my PR by mistake. I want to revert only this file without deleting this file locally. I just want that it doesn't show up in the Pull Request. I don't want to create new branch as many people have commented on other files in this PR.
12 Answers 12
If you updated a file that already existed and want to remove it from the PR:
Assume you're working on a branch off of staging , and you PR'd a file named validate_model.py .
To remove this file from the PR and revert its changes, simply do:
81.6k 41 41 gold badges 170 170 silver badges 232 232 bronze badges This simple answer is exactly what I needed, thanks!You could 'unstage' a particular file with git reset and then amend the original commit:
This will not affect the version of the file in your working copy.
Alternatively, if you want to remove multiple files, you can reset the branch's head to the previous commit and create a new one:
125k 36 36 gold badges 288 288 silver badges 349 349 bronze badgesThis will discard previous changes to the file and revert it to the last committed change.
Read the section Unmodifying a Modified File.
125k 36 36 gold badges 288 288 silver badges 349 349 bronze badgesThere are probably many ways how to remove/undo file changes in your PR.
I didn't find exact steps how to do this, so here it is:
Scenario:
Lets suppose that the file that you want to remove from PR is:
C:\GitRepos\MyProject\SomeFile.cs
This file is either modified or contains no changes (is the same as in master) but still is shown in your PR.
Solution:
1) Make sure that you have checked out the feature branch from which the PR has been created.
2) Search the file commit history: git log "C:\GitRepos\MyProject\SomeFile.cs"
You will see multiple records in format:
3) Find the commit before you made any changes to the SomeFile.cs . Copy the commit id .
4) Check out that commit using previously copied commit id :
git checkout <commit id> "C:\GitRepos\MyProject\SomeFile.cs"
5) If you now check the git status then you will see that the SomeFile.cs is now under pending changes.
6) The last thing that you need to do is to commit these changes by simply using:
git commit -m "Remove the SomeFile.cs from PR"
And push your changes. :)
- Lets call your PR is from feature-branch to master .
- Make sure you are in your feature-branch .
- Now lets say, you've made some unnecessary changes to ./abc1.py and you want your abc1.py to be the same as master.
Run the following command:
git checkout origin/master -- ./abc1.py
You'll have the same changes as your master branch. Now you can commit your changes and push.
3,637 2 2 gold badges 18 18 silver badges 30 30 bronze badgesI assume what you mean is that you committed a change to some file X and other files Y , Z and so on. Now you want to undo only the change on X . You don't want to show it in the push (I assume you mean push instead of pull), so you cannot simply edit X back to how it was before (maybe you accidently committed a password or other secret in your source file or whatever. ).
If there is one single commit which introduced your change in X , then it will be easiest if you use git rebase to "skip" that commit. Let's say previouscommit is the commit just before your change, and brokencommit is the commit you want to remove, then:
If, on the other hand, the changes on X are mixed across many commits and/or combined with changes on other files, then (where previouscommit is the last "good" commit):
In the interactive rebase, chose the edit action for every line where X was changed, and edit it out manually. c/f git help rebase for more details, though it should be pretty obvious what to do.
Я сделал запрос pull, но после этого я сделал некоторые коммиты для проекта локально, который закончил загрязнять мой запрос pull, я попытался удалить его, но без успеха.
Я нашел несколько подобных вопросов на StackOverflow, но я не могу применить то, что там. Это мой первый запрос на GitHub, поэтому мне странно, как все это работает.
выделенная фиксация-это та, которую мне нужно сохранить и удалить все остальные вещи. Это становится четвертой фиксацией в история, потому что я делаю некоторые вещи слияния.
мой журнал git
может кто-нибудь объяснить, что происходит и как решить эту проблему?
у вас есть несколько способов сделать это.
этот пост-прочитайте часть о revert подробно объяснит, что мы хотим сделать и как это сделать.
вот самое простое решение вашей проблемы:
команда revert создаст новую фиксацию с помощью отменить первоначальной фиксации.
люди не хотели бы видеть неправильную фиксацию и возврат фиксации для отмены изменений неправильной фиксации. Это загрязняет историю.
вот простой способ удаления неправильной фиксации вместо отмены изменений с помощью фиксации возврата.
git checkout my-pull-request-branch
git rebase -i HEAD
n // где n - это количество последних коммитов, которые вы хотите включить в интерактивной ребаз.
Итак, сделайте следующее ,
допустим, ваше имя ветви-my_branch, и у этого есть дополнительные коммиты.
- git checkout -b my_branch_with_extra_commits (сохранение этой ветви под другим именем)
- gitk (открывает консоль git)
- ищите фиксацию, которую вы хотите сохранить. Скопируйте SHA этого фиксации в блокнот.
- git checkout my_branch
- gitk (это откроет консоль git)
- щелкните правой кнопкой мыши на фиксации хотите вернуться в (состояние до ваших изменений) и нажмите " reset branch to here "
- сделать git pull --rebase origin branch_name_to _merge_to
- git cherry-pick <SHA you copied in step 3. >
теперь посмотрите на локальную историю фиксации филиала и убедитесь, что все выглядит хорошо.
Читайте также: