git执行过程中的一些疑问
情况简介:远程有仓库,分支就只有 master。本地仓库,是从远程的 master 上 clone 下来的,然后在本地改好,再 commit 然后 pull 然后 push
1、本地的这个是分支,还是是一个本地仓库?
本地和远程的关系,其实是两个分支,git pull 时已经自动绑定好对应关系了
2、在远程新建一个分支,然后 pull 下来,本地有分支么?本地的分支是不是远程新建的哪个分支?
归根到底,本地分支和远程分支是两个东西。远程新建一个分支拉到本地道理一样,是属于复制了一份。
3、本地仓库与本地分支有什么区别?
本地分支属于本地仓库,它们之间属于包含关系,一个仓库里可包含很多分支,如果是 tag 的话可分离出独立的仓库
4、commit 是提交到本地仓库,然后 push ,push 是把所有代码推到远程仓库,还是只是把 commit 的地方推到远程仓库
push 不是将所有代码都推到远程仓库里,是要通过对比 commit 的记录,如果本地高于远程,就直接把多出来的commit 给弄上去,如果本地的这几个 commit 和
远程的 commit 有冲突的部分就 merge ,然后根据提交时间排序,新建一个 merge 的 commit的记录再提交上去
5、为什么先 commit ,然后 pull ,然后再 push ,push 会不会把自己改的代码给覆盖掉,远程没有自己修改的代码,pull 之后,会不会覆盖掉我已经改过的代码。那我 push 没意义了
commit —> pull —> push 是应对多人合并开发的情况
commit 目的在于告知 git ,这次提交修改了哪些内容
pull 的目的在于比较 commit 和远程 commit 的对比记录,git 根据文件的行数进行对比,假如同时操作了某文件的同一行那么就会产生冲突,git 会把这个冲突给标记出来,然后就要问产生冲突的那个人,保留谁的代码。进而 git add && git commit && git pull,再次 pull 是防止解决这个冲突的途中,第三者又提交了新的代码进来,那么又要重新执行一遍。
在没有冲突的时候,pull 直接合并代码了,而不是把代码覆盖掉
代码覆盖或丢失情况:程序员 A 和 程序员 B 在 pull 的时候,版本都为 1 ,程序员 A 在本地提交了 2 和 3 的版本,并且推送到远程仓库
程序员 B 在进行修改时没有 commit ,自己先写了代码,然后进行 pull ,程序员 B 本地版本为 3 ,在 3 的版本修改了程序员 A 写的代码,进而 git pull&& gut push ,远程版本中为4,程序员 A 的代码被覆盖掉,所以要先 commit —> pull —> push
6、两个不同分支,A 与 B ,A 合并 B 和 B 合并 A,区别在哪?
唯一区别是 A -> B 时,B 分支上会产生一个 merge_commit 的信息,B 的合并状态而 A 未合并状态,如果没有发生任何改动,执行 B -> A ,直接切过去了,不会生成 merge_commit 的信息