Pull 就是 fetch + merge(或 fetch + rebase);是 fetch 步骤引入了新的 Git 对象。
Fetch 在逐个提交 的基础上工作。如果对象是所需提交的一部分,您的学生将获得整个提交,或者根本没有获得提交。1 那么,诀窍是创建一些 新的和不同的提交,更容易获得并提供学生需要的东西。
这样做:
-
在添加了大型数据集的提交之前找到提交。这个提交有一些哈希 ID,$hash。
-
创建一个新的分支名称指向这个提交:
git branch newbranch $hash
根据需要从此处进行新提交,例如,向文件添加更正,但不添加大型数据集。
-
让你的学生获取这个分支:
git fetch origin newbranch
然后检查这个新分支并在那里工作。
-
稍后,当事情好的时候,将主分支与大数据合并到新分支中:
git checkout newbranch; git merge mainbranch
从这里开始继续使用新分支:您现在甚至可以完全删除旧的主分支。新分支现在是主分支。
形象地说,我们正在做的就是这个。我们开始:
...--F--G--H--I--J <-- main
commit H 是我们关心的哈希值:在大数据被添加到 commit I 之前。提交J 可能存在也可能不存在:如果不存在,则提交I 是主分支上的最后一次提交。提交I 和J 都包含大文件,因此如果有人去获取提交J 或提交I,他们将获得所有数据。所以我们添加一个新的 name 指向 commit H:
I--J <-- main
/
...--F--G--H <-- newbranch
现在我们从I 和/或J 获取我们想要的任何更新,并使用它们来更新一些文件并制作新的提交快照K:
I--J <-- main
/
...--F--G--H------K <-- newbranch
提交K 没有大文件。通过避免获取I 和J,没有人需要等待大文件。
任何额外的工作都会增加更多的提交:
I--J <-- main
/
...--F--G--H--K--L <-- newbranch
这很好,最终我们将大文件带入git merge:
I----J <-- main
/ \
...--F--G--H--K--L--M <-- newbranch
所以提交M 有大文件。我们现在删除名称main,因为它不再对任何人有用:
I----J
/ \
...--F--G--H--K--L--M <-- newbranch
像往常一样将新提交添加到newbranch;大数据文件通过commitI到达; M 没有合并冲突,或者如果有,你通过从提交 L 获取适当的文件来解决它们;没有其他人需要解决任何问题。
1在非常现代的 Git 版本中有一个新功能 ,它允许部分获取单个提交。但是使用它很棘手,而且不是做你想做的正确方法。