Попытка git добавить -pно мерзавец ничего не делает - PullRequest
0 голосов
/ 13 сентября 2018

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

 1. git pull (before I started working)
 2. changed some code
 3. git diff > ~/my_diff
 4. git stash
 5. git pull
 6. git stash pop 

Это не удалось из-за конфликтов, поэтому я попытался:

 7. cp ~/my_diff ./
 8. git add -p ~/my_diff

Но я ничего не получаю ... Файл содержит много изменений, но дляпо какой-то причине он не предполагает никаких патчей.В чем проблема?


Это точный ответ от git :

Your branch is up-to-date with '...'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        my_diff

nothing added to commit but untracked files present (use "git add" to track)
.../trunk $ git add -p my_diff
    No changes.

Вот это head -30 ~/my_diff:

diff --git a/trunk/files_transfer_mgmt/inc/files_transfer_mgmt.h b/trunk/files_transfer_mgmt/inc/files_transfer_mgmt.h
index 28907bd..f108931 100644
--- a/trunk/files_transfer_mgmt/inc/files_transfer_mgmt.h
+++ b/trunk/files_transfer_mgmt/inc/files_transfer_mgmt.h
@@ -13,6 +13,7 @@
 #include "iss_api.h"
 #include "rf_termserver.h"
 #include "rf_versions_util.h"
+#include "common_apis.h"

 #ifdef __cplusplus
        extern "C" {
@@ -23,23 +24,40 @@

 #define DEVICE_SFP             "/dev/sfp"

-#define        SECONDS_TO_USECONDS(seconds)    (seconds * 1000000)
+#define SECONDS_TO_USECONDS(seconds)   (seconds * 1000000)
+
+#define DEFAULT_FTPS_ERR_LOG "FTPS_error_log_tmp.txt"

 #ifdef __cplusplus
         }
 #endif /* __cplusplus */

 void SECURE_StartFileDownloadFromHere(void * data);
+void SECURE_ZT_entry_point(void * data);
 void SECURE_StartGenericFileTransferFromHere(void * data);
 void SECURE_getDownloadStatus(int argc, char *argv[],FILE *fin, FILE *fout,pedro_callback_func_args_t *pedro);

так что вы можете видеть, что это правильно сформированный файл различий

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Тебе не нужно делать git diff, прежде чем тянуть, просто копи.Затем вытащите «stash pop» и исправьте конфликты.Git не удаляет ваши изменения из тайника, поэтому, если вам не удалось исправить конфликт, вы можете начать заново.Вы должны вручную очистить свой тайник в конце (только в случае конфликтов)

0 голосов
/ 13 сентября 2018

git add -p не читает файл патчей. Вместо этого он берет файл, который уже находится под контролем исходного кода Git, и сравнивает индексную версию этого файла с версией рабочего файла этого файла. Что бы ни отличалось, это , что git add -p позволяет интерактивно вносить исправления в индекс.

Следовательно, вместо того, что вы делали, вам пришлось бы сохранять где-нибудь каждый измененный файл, переключать коммиты, восстанавливать все измененные файлы в ваше рабочее дерево, и затем запустить git add -p ( без аргументов вообще). Но, как правило, это совершенно неправильный путь - он теряет всех иначе изменений.

Вместо этой последовательности вот что я бы порекомендовал и почему:

  1. git pull (до [начала работы])

Разделите это на git fetch; git merge, чтобы вы точно знали, что git pull делает с вами. (Можно сказать, для вас , но в случае git pull, это имеет тенденцию делать это до вас вместо для вас. Мой опыт с плохие старые времена Git 1.5 могут показываться здесь. :-) git pull в некоторых угловых случаях плохо ломал репозитории.)

Я на самом деле использую git merge --ff-only здесь только для того, чтобы вдвойне быть уверенным, что ничего странного не произошло. (У меня есть псевдоним git mff, для краткости git merge --ff-only. Иногда я использую несколько других трюков, но пока этого достаточно.)

  1. изменил код

Оставь эту часть. : -)

  1. git diff > ~/my_diff

Не беспокойся об этом. Вместо этого запустите git add и git commit. Если вы сделали много изменений на шаге 2, вы можете сначала создать новое имя ветви:

git checkout -b mostly-ready  # or some more suitable name
git add -u         # or `.` or `-a` if you prefer
git status         # check for unexpected new files, or untracked files
                   # make any adjustments you like here
git commit
git checkout -     # go back to previous branch
  1. git stash

Это больше не требуется. Все, что git stash делает, это делает коммиты, которые находятся на no branch; и, выполнив вышеприведенное или более простое git commit, вы сделали коммит в более подходящей ветке.

  1. git pull

Разделите это на git fetch; git merge или, если вы сделали коммит на самой ветви, а не на боковой ветви, git fetch; git rebase. (Вы можете запустить git pull --rebase, чтобы выполнить последовательность выборки и перебазирования, но, опять же, я думаю, что лучше разделить два шага.)

  1. git stash pop

Так как у вас нет тайника, здесь вам нечего будет искать. Если вы сделали коммит на месте и использовали git rebase, у rebase будут конфликты слияния, если таковые были, от передачи вашего коммита вперед. В противном случае ваш коммит находится на вашей боковой ветке mostly-ready, или как вы там его называли, и теперь вы можете запустить:

git cherry-pick -n mostly-ready

-n говорит Git , а не , чтобы зафиксировать результат. Это дает вам возможность просмотреть его и использовать git add -p, если хотите. Если возникают конфликты слияния, -n является избыточным, так как Git не сможет зафиксировать результат в любом случае. Обратите внимание, что есть важное предупреждение: некоторые ваших изменений могут быть уже подготовлены.

Что означает , точно

Важно помнить, что здесь, в Git, три копии каждого файла. Например, возьмем файл с именем README.txt. Три копии:

  • HEAD:README.txt (попробуйте git show HEAD:README.txt). Это зафиксированная версия файла, в частности, версия текущего коммита (он же HEAD он же @).

    Эта копия заморожена в коммите. Находясь в коммите, он является постоянным (пока он существует) и на 100% доступен только для чтения. Он хранится внутри в сжатом формате только для Git, иногда очень сжатым. Лишь немногие другие программы могут с этим справиться; в основном это формат Git-only, поэтому вам нужно использовать git show или git checkout, чтобы получить его.

  • README.txt. Это верстак версия.

    Это просто обычный файл. Вы можете делать с ней все что угодно. Git не особо заботится об этой копии; Git просто поместите его в свое рабочее дерево, чтобы вы могли получить к нему доступ и работать с ним / с ним.

  • :0:README.txt. Это index версия.

    Индекс, который также называется промежуточной областью или иногда кеш , содержит версию, о которой Git заботится , но которая находится в специальный сжатый формат Git-only. Этот файл готов к переходу на следующий коммит, который вы сделаете, но в отличие от замороженной, коммитной версии только для чтения, вы можете перезаписать копию индекса .

    Вот что делает git add: git add README.txt перезаписывает индексную версию :0:README.txt версией рабочего дерева README.txt. Это когда Git сообщает вам, что для коммита поставлено изменений. Дело не в том, что README.txt внезапно появился в области подготовки: он был там все время. Просто теперь, когда вы скопировали измененный README.txt поверх старого :0:README.txt, теперь версия в рабочей области отличается от версии, зафиксированной в коммите HEAD.

Итак, здесь нужно помнить, что вам нужно работать с файлами work-tree : вы можете редактировать их и все, что захотите. Но как только вы это сделаете, вам придется скопировать версию рабочего дерева поверх индексной версии. Некоторые команды Git, такие как git checkout, начинаются с того, что фиксированная зафиксированная версия и индексная версия совпадают. Некоторые, такие как git cherry-pick, могут изменять версию индекса (обычно при изменении версии рабочего дерева). Использование git add полностью перезаписывает индексную версию. Используя git reset, вы можете перезаписать поэтапную версию замороженной HEAD версией:

git reset README.txt

означает копия HEAD:README.txt поверх :0:README.txt, не касаясь рабочего дерева README.txt вообще.

Когда вы в конечном итоге запускаете git commit, то, что это делает, действительно довольно просто: оно замораживает все версии индекса в новый коммит. Они уже в нужной форме, сидят там в области указателя / постановки. Файлы в рабочем дереве не важны; имеют значение только файлы в индексе!

Две очень полезные git diff формы

Продолжительность:

git diff --cached

сравнивает для каждого файла версию HEAD (замороженную) с индексной версией и показывает разницу. Это что отличается в коммите, который вы собираетесь сделать.

Продолжительность:

git diff

сравнивает индексную (готовую к фиксации) версию каждого файла с версией рабочего дерева и показывает разницу. Это что отличается в коммите, который вы могли бы сделать, от того, что вы могли git add.

Продолжительность:

git status

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

0 голосов
/ 13 сентября 2018

Чтобы применить my_diff, вы должны использовать команду git для применения патча, как указано ниже,

git apply mydiff

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...