如何使用git 提交作業 收作業
如何使用git 提交作業 收作業
今天就來用一個通俗易懂的自然模型來解釋Git的commit,pull和push。不過,我們首先要理解兩個名詞,remote,local。
remote,翻譯成中文,就是遠程。為了更便於理解,我們稱之為遠程(代碼)庫。
local,本地的意思。同理,謂之本地(代碼)庫。
把這兩個名字回歸到一個我們熟悉的自然模型。
remote,就是學校。local,為你自己家。
你寫的代碼,就是你寫的作業。
commit,提交的意思。
pull,直譯為拉取,更通俗的講,獲取。
push,推送。
那麽每天放學之前,老師布置了今天的回家作業。從布置回家作業,到第二天交回家作業,經歷了哪些過程呢。
首先你要知道老師布置了什麽作業,作業有什麽要求。也就是你需要明確你需要寫哪些代碼,用什麽語言,完成什麽具體的需求等等。
然後,你需要把你的回家作業拿回家。這一步,就是pull(獲取)。
回家之後,勤奮的你鞋子都沒脫,就打開了書包開始寫作業。
一小時之後,你寫完了作業。
接下來,就是把你寫好的作業放在書包裏,準備第二天交給在學校的老師。
把寫好的作業放在書包裏,這一步,就是git commit。
第二天早上,你高高興興的去上學,拿出你的作業,交給老師。這一步就是push(提交)。
一個簡單的拿作業到交作業的流程就是這個樣子的。
不過,Git這個版本控制軟件當然沒有這麽的簡單,下一篇文章我將分享如何理解branch,merge,rebase以及如何使用Git進行多人協作。
那麽,今天我們來思考,如何用Git讓大家共同完成一份作業,也就是寫一個程序。
首先,引入Git的branch概念。
之前的舉的一個寫作業的例子,我們現在來拓展一下這個模型。
學校裏不可能只有你一個學生,你的班級裏不可能只有你一個學生。
學校,可以理解成你的公司。班級,你所在的部門。學生,軟件工程師(程序員)。
每個人都會push自己寫好的作業,那麽我們如何把不同人寫的作業的過程(也就是代碼提交的修改,還記得我們的第一節說的嗎)清晰的顯示出來呢。很簡單,把不同人寫的作業分開來放唄。
比如,張三寫的一本本作業(一次次代碼修改)放在一條線上,稱這條線為zhangsan,貼一個zhangsan的標簽。
李四寫的一本本作業(一次次代碼修改)放在zhangsan這條線的在地板這個平面的一條平行線上,稱這條線為lisi,在這條線上貼一個lisi的標簽。。
這分開的兩條線,就是兩個branch。
張三可以在zhangsan這條線上放上(push)自己的作業,李四可以在lisi這條線上放上(push)自己的作業,兩條線之間可以互相不沖突。
當然,最後,老板(或者你的上司)會將作業寫的好人的作業放在紅榜上進行表揚。那麽我們就需要一條線來放置老板認為質量最好的作業,對吧?我們稱這條線為master,也就是我們的主線,這裏放著寫的質量最高的作業。
有了這條線,接下來我們是不是要把最好的作業放到master上呢?
而在Git中,完成這個操作有兩種方式。一個是merge,一個是rebase。
我們先來弄清楚merge。
大家應該都已經懂了,我們每次都commit,都是一次代碼的改動,那麽多次代碼的改動,當然可以變成一次改動,也就是將多次commit合並。多個commit與這多個commit合並所得的commit,是等價的。
張三把多次commit合並,變成了一個commit,然後把這次commit,合並到master這個branch上。這個操作就是merge zhangsan into master,這樣會導致master這個branch只多一個commit。這個commit可能是多次commit的一次合成。Merge這個操作,就是將zhangsan這個branch相對於master的修改,在master上也進行了一次等價的修改。
那麽這樣zhangsan和master其實是一樣的了,所以我們其實只需要一條線了,對吧。然後在這條線上貼上兩個標簽,zhangsan和master。
那麽什麽是相對於master的修改?
這裏需要解釋一下。假象一下,master這個branch上的作業(代碼)是星期六的作業了。zhangsan這個branch在此時和master這個branch是一模一樣的。你(比如你是zhangsan)星期天在你的branch commit並push了。那麽相對於master這條branch,zhangsan這個branch有了星期日的作業,也就是相對於master有了修改。
那麽什麽是rebase?
同樣的,有了相對的修改。
rebase,與merge不同,不會將多次commit合成一個commit。
而是將相對的修改直接抄過去。比如rebase master on lisi,就是將lisi這個branch相對於master的修改直接抄上去了,而且是一個commit一個commit的抄,那就會在master上留下多次commit。
其後面的本質其實是這樣的,先將lisi這個branch相對於master的修改截取下來,保存在一個地方。此時lisi和master是等價的了。也就是一條線2個標簽,然後這時把我們剛剛保存起來的修改,一個一個的放在master這條線上。
這就是rebase。
參考:https://www.jianshu.com/p/0623cb42fcfa
如何使用git 提交作業 收作業