首頁  >  問答  >  主體

git - 為什麼要先commit,然後pull,最後再push?而不是commit然後直接push?

實在想不明白,網路上也沒有講這個的明確說法。
情況是這樣的,現在遠端有一個倉庫,分支就一個,是master。然後我本地的倉庫是從遠端的master上clone下來的。大家都是clone下來,再在自己本地改好,再commit然後pull然後push,大家都是這麼做的。那麼現在問題來了:

1,那我本地這個也算是分支?還是就是一個本地倉庫?

2,如果我在遠端新建了個分支,然後我pull了下來,那我本地到底有分支這個說法嗎?我本地的分支是不是就是那個遠端新建的分支?

3,本地倉庫和本地分公司有什麼差別?

4,commit是提交到本地倉庫,然後push,這個push是把所有程式碼推到遠端倉庫,還是只是把commit的地方推到遠端倉庫?

5,那為什麼要先commit,然後pull,然後再push,我pull了,豈不是把自己改的程式碼都給覆蓋掉了嘛,因為遠端沒有我改的程式碼,我pull,豈不是覆蓋了我本地的改動好的地方了?那我還怎麼push?

6,兩個分支,A和B,A合併B和B合併A,有差別嗎?

怪我咯怪我咯2728 天前3567

全部回覆(3)我來回復

  • 滿天的星座

    滿天的星座2017-05-25 15:10:32

    見解

    1.本地算一個clone體。

    2.是得,如果遠端有一個分支 dev,那麼pull origin dev,本地就會有一個dev分支。

    3.倉庫是整個項目,分支算其中一個生產線。就跟阿里巴巴集團不是只有一個淘寶一樣

    4.push會進行分析,當然不是所有,你可以自己測試,弄一些大文件,第一次新建項目的push會很慢,如果你加一個幾k的文本,那這次傳輸很快

    5.commit是防止遠端直接覆蓋你本地,只要有修改都會讓你commit,提示你pull原因是因為你遠程當中有最新的東西和你本地不一致,git知道,遠程分支的東西不能丟掉,所以讓你pull下來存到本地,讓本地變成最新的最後push上去,難麼同理的方式你本地就是最新,便會去修改遠程的。

    回答完畢,麼麼噠

    回覆
    0
  • ringa_lee

    ringa_lee2017-05-25 15:10:32

    1. 首先pull不会把你本地代码覆盖掉,而是提醒merge冲突,需要你手动merge一下;

    2. 為什麼要pull?因为对你来说你本地可能有个分支,你在这个分支上面工作,那么也有可能存在其他人和你一样的做法,也许你们的代码有依赖又或是有冲突,你肯定不能在master裡面測試,你要確保自己分支是最新程式碼;

    3. 本地分支代碼不一定和本地倉庫是一致的,你把本地代碼提交了才會存到本地倉庫中,就相當於本地分支是你開發的一個平台,但是最後開發的產出存放地址是本地倉庫

    兩種都可以,只不過大部分人選擇先pull,因为你没提交你的代码,别人提交了,这时候git会自动merge,而如果你提交了,有时候git自动merge会报冲突,选择先pull就是图一个方便和省事,当然也有人选择先pushpull,這樣可以了解其他夥伴對程式碼的改動

    通俗的說就例如原來master的代码快照是1,你的同伴改了提交了是2,你的提交代码是3,如果你先pull,那么就是3和1merge,而3包含1,git选择最新代码3覆盖1,不存在冲突关系,而你先pushpull,那就是2和3merge,这是git自动merge就會出錯,因為他不知道哪些需要哪些不需要

    merge問題
    a和b合併 和 b和a合併 最後產生的代碼是一樣的,都是把兩個分支需要的代碼保留,集成一個大家都認可的代碼

    唯一不同的可能merge過程有點不一樣,這個得視情況而定,不過大致上都差不多

    回覆
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-05-25 15:10:32

    1. 本地和遠端的關係相當於兩個分支,你感覺一樣是因為你git pull 的時候已經自動給綁定好對應關係了, set-upstream..balbala

    2. 你遠端新建了一個分支拉到本地的道理是一樣的,屬於複製了一份,但是本地分支和遠端分支已經是兩個東西了

    3. 本地分支屬於本地倉庫裡,是包含關係,一個倉庫裡可以有很多分支, 如果是 tag 的話可以分離出獨立的倉庫

    4. 肯定不會全量推送到遠端的,是透過對比 commit 的記錄,如果本地高於遠端就直接把多出來的commit 给怼上去,如果本地的这几个 commit 和远程的 commit 有冲突的部分就merge,然後根據提交時間排序再新建一個merge 的 commit 記錄再懟上去

    5. 這個先 commit 再 pull 再 push 的情況就是為了應對多人合併開發的情況,

      1. commit 是為了告訴 git 我這次提交改了哪些東西,不然你只是改了但是 git 不知道你改了,也就無從判斷比較;

      2. pull是为了本地 commit 和远程commit 的对比记录,git 是按照文件的行数操作进行对比的,如果同时操作了某文件的同一行那么就会产生冲突,git 也会把这个冲突给标记出来,这个时候就需要先把和你冲突的那个人拉过来问问保留谁的代码,然后在 git add && git commit && git pull 這三連,再次pull 一次是為了防止再你們協商的時候另一個人給又提交了一版東西,如果真發生了那流程重複一遍,通常沒有衝突的時候就直接給你合併了,不會把你的程式碼給掉

      3. 出現代碼覆蓋或丟失的情況:例如A B兩人的代碼pull 時候的版本都是1,A在本地提交了2,3並且推送到遠程了,B 進行修改的時候沒有commit 操作,他先自己写了东西,然后 git pull 这个时候 B 本地版本已经到3了,B 在本地版本3的时候改了 A 写过的代码,再进行了git commit && git push 操作,他先自己寫了東西,然後

        這個時候B 本地版本已經到3了,B 在本地版本3的時候改了A 寫過的代碼,再進行了git commit && git push 那麼在遠端版本中就是4,而且A 的程式碼被覆蓋了,所以說所有人都要先commit 再pull,不然真的會覆蓋代碼的
    🎜

    回覆
    0
  • 取消回覆