我正在尝试使用this来应用我所做的重大更改。我做了以下事情:
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);
所以您可以看到它是格式正确的差异文件
答案 0 :(得分:2)
git add -p
无法读取补丁文件。相反,它将获取一个已经在Git的源代码控制下的文件,并将该文件的索引版本与该文件的工作树版本进行比较。不管有什么不同,这就是 git add -p
,让您可以交互式地将其修补到索引中。
因此,您不得不将每个修改后的文件保存在某个地方,切换提交,将所有修改后的文件恢复到您的工作树中,然后然后运行{{1 }}(完全没有参数)。但这通常是错误的方法-失去了每个人的其他变化。
这不是我推荐的顺序,而是我的建议,以及原因:
git add -p
(在[开始工作之前])
将其拆分为git pull
,以便您确切了解git fetch; git merge
对您的作用。 (有人可能会为您说 ,但是在git pull
的情况下,它倾向于是发给给您而不是 for 给您。我在Git 1.5的旧时的糟糕经历可能会在这里显示出来::-) git pull
在某些极端情况下曾经严重破坏了存储库。)
我实际上在这里使用git pull
只是为了确保没有任何奇怪的事情发生。 (我的别名为git merge --ff-only
,简称为git mff
。有时我会使用其他一些技巧,但这已经足够了。)
- 更改了一些代码
保留这一部分。 :-)
git merge --ff-only
不要为此烦恼。而是运行git diff > ~/my_diff
和git add
。如果您在步骤2中进行了很多更改,则可以先创建一个新的分支名称:
git commit
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
这不再是必需的。 git stash
所做的只是在 no 分支上进行提交;通过执行上述操作或更简单的git stash
,您可以在更合适的分支上进行提交。
git commit
将其拆分为git pull
,或者,如果您是在分支本身而不是在侧分支上进行提交的,则将git fetch; git merge
拆分。 (您可以运行git fetch; git rebase
进行获取和重新设置序列,但是同样,我认为最好将两个步骤分开。)
git pull --rebase
由于您没有藏匿处,因此这里没有东西可弹出。如果您进行了提交并使用了git stash pop
,则rebase将存在向前传输提交时发生的合并冲突(如果存在)。否则,您的提交将在分支git rebase
或您所谓的分支上,现在可以运行:
mostly-ready
git cherry-pick -n mostly-ready
告诉Git 不提交结果。这使您有机会查看它并根据需要使用-n
。如果存在合并冲突,则git add -p
是多余的,因为Git仍然无法提交结果。请注意,有一个重要警告:您所做的更改中的一些已经发布。
请务必记住,在Git中,每个文件都有三个副本。让我们以一个名为-n
的文件为例。这三个副本是:
README.txt
(尝试HEAD:README.txt
)。这是文件的提交版本,特别是当前提交中的版本(也称为git show HEAD:README.txt
或HEAD
)。
此副本被冻结为提交。在提交中,它是永久性的(好,只要提交存在),并且100%只读。它以仅Git的压缩格式在内部存储-有时非常压缩。几乎没有其他程序可以处理它;它基本上是仅支持Git的格式,因此必须使用@
或git show
来实现。
git checkout
。这是工作树版本。
这只是一个普通文件。您可以用它做任何您想做的事。 Git并不太在乎这个副本。 Git只是将其放入您的工作树中,以便您可以访问它并对其进行处理。
README.txt
。这是 index 版本。
该索引(也称为暂存区或有时称为 cache )具有Git 关心的版本,但是采用特殊的,压缩的,仅Git格式。该文件已准备好进入您要进行的下一步提交-但与冻结的只读 committed 版本不同,您可以 覆盖索引副本。
这就是:0:README.txt
的作用:git add
用工作树版本git add README.txt
覆盖索引版本:0:README.txt
。这是Git告诉您,有变更已提交提交。并不是README.txt
突然出现在登台区域:一直存在。只是现在您将修改后的README.txt
复制到旧的README.txt
之上,现在暂存区域中的版本与冻结到{{1 }}提交。
因此,这里要记住的事情是您必须处理工作树文件:您可以编辑这些文件,并且随心所欲。但是一旦完成,就必须在索引版本的顶部复制工作树版本。某些Git命令(例如:0:README.txt
)是通过使冻结的提交版本和索引版本相同来开始的。有些文件,例如HEAD
,可以更改索引版本(通常同时也更改工作树版本)。使用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
和index之间不同的文件被暂存提交,而在索引和工作树之间不同的文件暂不暂存提交。
答案 1 :(得分:0)
要应用my_diff,您应使用git命令按如下所示应用补丁,
git apply mydiff