Как выборочно объединить или выбрать изменения из другой ветки в Git?

Ответ выше не подходит для усложнения выражения Linq. Все что вам нужно:

// set up the "main query"
var test = from p in _db.test select _db.test;
// if str1 is not null, add a where-condition
if(str1 != null)
{
    test = test.Where(p => p.test == str);
}
1327
задан vas 30 April 2018 в 22:35
поделиться

5 ответов

Вы используете избирательный подход команда для получения отдельных фиксаций от одного ответвления.

, Если изменение (изменения) Вы хотите, не находятся в отдельных фиксациях, затем используют метод, показанный здесь , разделяет фиксацию на отдельные фиксации . Примерно говоря, Вы используете git rebase -i, чтобы заставить исходную фиксацию редактировать, затем git reset HEAD^ для выборочного возвращения изменений, тогда git commit для фиксации того бита как новой фиксации в истории.

существует другой хороший метод здесь в Журнале Red Hat, где они используют git add --patch или возможно git add --interactive, который позволяет Вам добавлять просто части ломтя, если Вы хотите разделить различные изменения в отдельном файле (поиск на той странице для "разделения").

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

442
ответ дан vas 30 April 2018 в 22:35
поделиться
  • 1
    Я работал мой сравнительный тест , исправляя для неподдерживаемых битов входа sed -i 's/e[-+][0-9][0-9]//g' и sed -i 's/nan/0.0/g' и адаптируя код для соответствия остальной части сравнительных тестов (т.е. пробел синтаксического анализа...). Я обошел 1,84 с. Обратите внимание, что вход был на самом деле уменьшен до 408 МБ (от 515 МБ, 21%-е сокращение). Компенсация этого дала бы 2,32 с – sehe 5 July 2013 в 02:01

1800 Ответ ИНФОРМАЦИИ полностью верен. Однако, как git noob, «использовать git cherry-pick» было недостаточно для того, чтобы я понял это без каких-либо дополнительных копаний в Интернете, поэтому я решил опубликовать более подробное руководство на случай, если кто-то еще будет в похожая лодка.

Мой вариант использования заключался в желании выборочно перенести изменения из чужой ветви github в мою собственную. Если у вас уже есть локальная ветвь с изменениями, вам нужно только выполнить шаги 2 и 5-7.

  1. Создать (если не создал) локальную ветвь с изменениями, которые вы хотите внести.

    $ git branch mybranch <базовая ветка>

  2. Переключитесь на нее.

    $ git checkout mybranch

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

    $ git remote add repos-w-changes

  4. Снять все из их ветки.

    $ git pull repos -w-changes branch-i-want

  5. Просмотрите журналы коммитов, чтобы увидеть, какие изменения вы хотите:

    $ git log

  6. Вернитесь к ветке, в которую вы хотите перенести изменения.

    $ git checkout originalbranch

  7. Cherry выбирает ваши коммиты, один за другим, с помощью хэшей.

    $ git cherry-pick -x hash-of-commit

Подсказка для шляпы: http: //www.sourcemage. org / Git_Guide

47
ответ дан 19 December 2019 в 20:14
поделиться

I don't like the above approaches. Using cherry-pick is great for picking a single change, but it is a pain if you want to bring in all the changes except for some bad ones. Here is my approach.

There is no --interactive argument you can pass to git merge.

Here is the alternative:

You have some changes in branch 'feature' and you want to bring some but not all of them over to 'master' in a not sloppy way (i.e. you don't want to cherry pick and commit each one)

git checkout feature
git checkout -b temp
git rebase -i master

# Above will drop you in an editor and pick the changes you want ala:
pick 7266df7 First change
pick 1b3f7df Another change
pick 5bbf56f Last change

# Rebase b44c147..5bbf56f onto b44c147
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

git checkout master
git pull . temp
git branch -d temp

So just wrap that in a shell script, change master into $to and change feature into $from and you are good to go:

#!/bin/bash
# git-interactive-merge
from=$1
to=$2
git checkout $from
git checkout -b ${from}_tmp
git rebase -i $to
# Above will drop you in an editor and pick the changes you want
git checkout $to
git pull . ${from}_tmp
git branch -d ${from}_tmp
102
ответ дан 19 December 2019 в 20:14
поделиться

У меня была точно такая же проблема, как упомянуто вами выше. Но я нашел этот более ясным в объяснении ответа.

Резюме:

  • Проверить путь (пути) из ветки, которую вы хотите объединить,

     $ git checkout source_branch -  ...
    

    Подсказка: он также работает без - , как показано в связанной публикации.

  • или для выборочного слияния фрагментов

     $ git checkout -p source_branch -  ...
    

    Или используйте сброс, а затем добавьте с опцией -p ,

     $ git reset  ...
    $ git add -p <пути> ...
    
  • Наконец, зафиксируйте

     $ git commit -m "'Объединить' эти изменения"
    
946
ответ дан 19 December 2019 в 20:14
поделиться

Я знаю, что немного опоздал, но это мой рабочий процесс для объединения выборочных файлов.

#make a new branch ( this will be temporary)
git checkout -b newbranch
# grab the changes 
git merge --no-commit  featurebranch
# unstage those changes
git reset HEAD
(you can now see the files from the merge are unstaged)
# now you can chose which files are to be merged.
git add -p
# remember to "git add" any new files you wish to keep
git commit
15
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: