1. 程式人生 > >如何使用git 提交作業 收作業

如何使用git 提交作業 收作業

nbsp 需求 oca 存在 質量 沖突 ast rebase 接下來

如何使用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 提交作業 收作業