Java 如何使用JGIT恢复到修订版
我无法恢复到特定的修订版本。下面是我正在运行的代码 运行此代码后,我希望在文件中只看到“第1行”和“第2行”。但是,当我打开它时,它有全部3行。我希望提交一个新版本,包括提交2中的内容Java 如何使用JGIT恢复到修订版,java,eclipse,git,jgit,Java,Eclipse,Git,Jgit,我无法恢复到特定的修订版本。下面是我正在运行的代码 运行此代码后,我希望在文件中只看到“第1行”和“第2行”。但是,当我打开它时,它有全部3行。我希望提交一个新版本,包括提交2中的内容 import java.io.File; import java.util.Iterator; import org.apache.commons.io.FileUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.RevertCo
import java.io.File;
import java.util.Iterator;
import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.RevertCommand;
import org.eclipse.jgit.revwalk.RevCommit;
public class JGit1 {
public static void main(String[] args) {
try {
// create a clean repository
File path = new File("c:/temp/agit/gitrepo");
if (path.exists()) {
FileUtils.deleteDirectory(path);
}
Git git = Git.init().setDirectory(path).call();
System.out.println("Created a new repository at " + git.getRepository().getDirectory());
// Create a new file and add it to the index
File newFile = new File(path, "file1.txt");
FileUtils.writeStringToFile(newFile, "Line 1\r\n", "UTF-8", true);
git.add().addFilepattern("file1.txt").call();
RevCommit rev1 = git.commit().setAuthor("test", "test@test.com").setMessage("Commit Log 1").call();
// commit some changes
FileUtils.writeStringToFile(newFile, "Line 2\r\n", "UTF-8", true);
git.add().addFilepattern("file1.txt").call();
RevCommit rev2 = git.commit().setAll(true).setAuthor("test", "test@test.com").setMessage("Commit Log 2").call();
// commit some changes
FileUtils.writeStringToFile(newFile, "Line 3\r\n", "UTF-8", true);
git.add().addFilepattern("file1.txt").call();
RevCommit rev3 = git.commit().setAll(true).setAuthor("test", "test@test.com").setMessage("Commit Log 3").call();
RevertCommand revertCommand = git.revert();
// revert to revision 2
revertCommand.include(rev2);
RevCommit revCommit = revertCommand.call();
// print logs
Iterable<RevCommit> gitLog = git.log().call();
Iterator<RevCommit> it = gitLog.iterator();
while (it.hasNext()) {
RevCommit logMessage = it.next();
System.out.println(logMessage.getName() + " - " + logMessage.getFullMessage());
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
javadoc for states包含对要还原的提交的引用,因此您实际上需要指定应该还原的提交,即rev3,而不是要重置的提交
您实际尝试的是恢复commit rev2中所做的更改,在本例中,这会导致与commit rev3中的更改发生合并冲突。调用后,可以通过getUnmergedPath()/getFailingResults()通过revertComment看到这一点
因此,以下内容应添加第四次提交,以恢复对rev3的更改:
RevertCommand revertCommand = git.revert();
// revert to revision 2
revertCommand.include(rev3);
RevCommit revCommit = revertCommand.call();
System.out.println("Reverted: " + revCommit);
System.out.println("Reverted refs: " + revertCommand.getRevertedRefs());
System.out.println("Unmerged paths: " + revertCommand.getUnmergedPaths());
System.out.println("Failing results: " + revertCommand.getFailingResult());
// print logs
gitLog = git.log().call();
for (RevCommit logMessage : gitLog) {
System.out.println("After revert: " + logMessage.getName() + " - " + logMessage.getFullMessage());
}
System.out.println("File contents: " + FileUtils.readFileToString(newFile, "UTF-8"));
前几行代码创建一个文件。它会添加一个不同的文件。可能会导致一个空的提交。我想你要找的是ResetCommand。你试过用这个吗?我不想重置。我只想将更改恢复为历史上的新提交。理解。然而,您的代码片段是有缺陷的。创建
rev2
和rev3
的提交缺少AddCommand
。请确保中间步骤产生预期结果。setAll(true)
负责添加更改,问题是为reverte命令指定了哪个提交id。
Line 1
Line 2
RevertCommand revertCommand = git.revert();
// revert to revision 2
revertCommand.include(rev3);
RevCommit revCommit = revertCommand.call();
System.out.println("Reverted: " + revCommit);
System.out.println("Reverted refs: " + revertCommand.getRevertedRefs());
System.out.println("Unmerged paths: " + revertCommand.getUnmergedPaths());
System.out.println("Failing results: " + revertCommand.getFailingResult());
// print logs
gitLog = git.log().call();
for (RevCommit logMessage : gitLog) {
System.out.println("After revert: " + logMessage.getName() + " - " + logMessage.getFullMessage());
}
System.out.println("File contents: " + FileUtils.readFileToString(newFile, "UTF-8"));