Android學習筆記Android必備開發工具之一命令行創建Git庫(Dean) – Android移動開發技術文章_手機開發 Android移動開發教學課程

在前面一篇文件簡述瞭一個標準流程的基本Git的操作!現在我嘗試自己建立git庫並操作文件將git命令的使用進行分析!采用SSH方式讓局域網的同學們可以訪問並且push和clone!

首先要安裝的幾個工具包:
Java代碼 
git工具包 
sudo apt-get install git-core   
一個圖形操作界面的git工具 
sudo apt-get install gitk 
局域網訪問個哦你覺包ssh 
sudo apt-get install ssh 


註意瞭!開始搭建瞭!
先創建一個workspaces文件夾
Java代碼 
deanye@dean:~$ mkdir workspaces 
deanye@dean:~$ cd workspaces 


 


將此文件夾作為版本庫
Java代碼 
deanye@dean:~/workspaces$ git init 
Initialized empty Git repository in /home/deanye/workspaces/.git/ 


 
Java代碼 
HEAD代表當前最新狀態。 
tag為某個狀態的標簽。 
SHA1為每個提交日志的唯一標識。 
開發人員需要為git倉庫配置相關信息,這樣在提交代碼時,這些信息會自動 
反映在git倉庫的日志中。 
  
git config user.name "your name" 
git config user.email yourname@email_server 
git config core.editor vim 
git config core.paper "less -N" 
git config color.diff true 
git config alias.co checkout 

 

這樣,一個空的版本庫就創建好瞭,並在當前目錄中創建一個叫 .git 的子目錄。你可以用 ls -a 查看一下,並請註意其中的三項內容:
  * 一個叫 HEAD 的文件,我們現在來查看一下它的內容:
  $ cat .git/HEAD
  現在 HEAD 的內容應該是這樣:
  ref: refs/heads/master
  我們可以看到,HEAD 文件中的內容其實隻是包含瞭一個索引信息,並且,這個索引將總是指向你的項目中的當前開發分支。
  * 一個叫 objects 的子目錄,它包含瞭你的項目中的所有對象,我們不必直接地瞭解到這些對象內容,我們應該關心是存放在這些對象中的項目的數據。
  Note
  關於 git 對象的分類,以及 git 對象數據庫的說明,請參看 [Discussion]
  * 一個叫 refs 的子目錄,它用來保存指向對象的索引。
  具體地說,子目錄 refs 包含著兩個子目錄叫 heads 和 tags,就像他們的名字所表達的意味一樣:他們存放瞭不同的開發分支的頭的索引, 或者是你用來標定版本的標簽的索引。
  請註意:master 是默認的分支,這也是為什麼 .git/HEAD 創建的時候就指向 master 的原因,盡管目前它其實並不存在。 git 將假設你會在 master 上開始並展開你以後的工作,除非你自己創建你自己的分支。
  另外,這隻是一個約定俗成的習慣而已,實際上你可以將你的工作分支叫任何名字,而不必在版本庫中一定要有一個叫 master 的分支,盡管很多 git 工具都認為 master 分支是存在的。
  現在已經創建好瞭一個 git 版本庫,但是它是空的,還不能做任何事情,下一步就是怎麼向版本庫植入數據瞭。

新建幾個文件和文件夾
Java代碼 
deanye@dean:~/workspaces$ mkdir text_a 
deanye@dean:~/workspaces$ mkdir text_b 
deanye@dean:~/workspaces$ ls 
text_a  text_b 
deanye@dean:~/workspaces$ echo "abc">>text_c 
deanye@dean:~/workspaces$ echo "abcd">>text_d 
deanye@dean:~/workspaces$ ls 
text_a  text_b  text_c  text_d 
deanye@dean:~/workspaces$  

 

 


查看當前的狀態
Java代碼 
deanye@dean:~/workspaces$ git status 

 

 
Java代碼 
diff: 
  
開發人員在本地進行開發後,可以使用git diff查看改動。 
除瞭直接比較當前開發後的改動外,git diff還可以: 
  
git diff tag                    比較tag和HEAD之間的不同。 
git diff tag file               比較一個文件在兩者之間的不同。 
git diff tag1..tag2             比較兩個tag之間的不同。 
git diff SHA11..SHA12           比較兩個提交之間的不同。 
git diff tag1 tag2 file or 
git diff tag1:file tag2:file    比較一個文件在兩個tag之間的不同。 


這個時候可以案件剛才添加的兩個文本文件的狀態!文件夾為空所以無法看到

可以添加一個修改text_c到默認的branch master 然後在次查看狀態
Java代碼 
deanye@dean:~/workspaces$ git add text_c 


 


git add 實際上是個腳本命令,它是對 git 內核命令 git update-index 的調用。因此上面的命令和下面的命令其實是等價的:
  $ git update-index –add text_c
  如果你要將某個文件從 git 的目錄跟蹤系統中清除出去,同樣可以用 git update-index 命令。例如:
  $ git update-index –force-remove text_c

也可以全部添加當期的改動文件(註意此時並為提交到branch)
Java代碼 
deanye@dean:~/workspaces$ git add . 

 

 


通過 git commit 命令來提交:
Java代碼 
deanye@dean:~/workspaces$ git commit -m "first commit" 

 

 


查看歷史修改
Java代碼 
deanye@dean:~/workspaces$ git log 

 

 

Java代碼 
log: 
  
git log file                    查看一個文件的改動。 
git log -p                      查看日志和改動。 
git log tag1..tag2              查看兩個tag之間的日志。 
git log -p tag1..tag2 file      查看一個文件在兩個tag之間的不同。 
git log tag..                   查看tag和HEAD之間的不同。 
  


修改兩個文件並且查看修改文件diff
Java代碼 
deanye@dean:~/workspaces$ git diff . 


 


我們可以再次使用組合命令 git add 和 git commit 將我們的工作提交到版本庫中
Java代碼 
deanye@dean:~/workspaces$ git add . 
deanye@dean:~/workspaces$ git commit -m "second" 


 

或者直接
Java代碼 
git commit -a -m "second" 

Java代碼 
commit: 
  
git commit -a -e        提交全部修改文件,並調用vim編輯提交日志。 
git reset HEAD^ or 
git reset HEAD~1        撤銷最後一次提交。 
git reset –hard HEAD^  撤銷最後一次提交並清除本地修改。 
git reset SHA1          回到SHA1對應的提交狀態。 
  


Java代碼 
add/delete/ls: 
  
git add -a              添加所有文件。除瞭.gitignore文件中的文件。 
git rm file             從git倉庫中刪除文件。 
git commit              添加或是刪除後要提交。 
  
git ls-files -m         顯示修改過的文件。 
git ls-files            顯示所有倉庫中的文件。 


上面是提交的基本流程下面一個重點也是git的精髓
Java代碼 
管理分支 

查看當前分支
Java代碼 
deanye@dean:~/workspaces$ git branch 


 

創建一個分支並移到該分支
deanye@dean:~/workspaces$ git checkout -b first

 


git show-branch 命令可以使我們看到版本庫中每個分支的世系發展狀態,並且可以看到每次提交的內容是否已進入每個分支。
Java代碼 
deanye@dean:~/workspaces$ git show-branch  


 

從上圖可以看出branch的層次結構類似與樹形
關於 GIT 版本世系編號的定義,請參看 git help rev-parse

再用 git whatchanged 命令來看看 master 分支是怎麼發展的

deanye@dean:~/workspaces$ git checkout  master

 

我們可以在每一個不同分支上做自己的修改!
也就是有多種不同的工程環境!

合並兩個分支:git merge
Java代碼 
$ git checkout master 
$ git merge -m "Merge" second 

合並兩個分支,還有一個更簡便的方式,下面的命令和上面的命令是等價的
Java代碼 
$ git checkout master 
$ git pull . second 

但是,此時 git 會出現合並沖突提示:$ cat text_c然後解決沖突
還有更復雜的三路合並和多內容樹合並的情況。詳情可參看: git help read-tree, git help merge 等文檔。

逆轉與恢復
逆轉與恢復:git reset
  項目跟蹤工具的一個重要任務之一,就是使我們能夠隨時逆轉(Undo)和恢復(Redo)某一階段的工作。
  git reset 命令就是為這樣的任務準備的。它將當前的工作分支的 頭 定位到以前提交的任何版本中,它有三個重置的算法選項。
  命令形式:
  git reset [–mixed | –soft | –hard] [<commit-ish>]
  命令的選項:
  –mixed
  僅是重置索引的位置,而不改變你的工作樹中的任何東西(即,文件中的所有變化都會被保留,也不標記他們為待提交狀態),並且提示什麼內容還沒有被更新瞭。這個是默認的選項。
  –soft
  既不觸動索引的位置,也不改變工作樹中的任何內容,我們隻是要求這些內容成為一份好的內容(之後才成為真正的提交內容)。這個選項使你可以將已經提交的東西重新逆轉至“已更新但未提交(Updated but not Check in)”的狀態。就像已經執行過 git update-index 命令,但是還沒有執行 git commit 命令一樣。
  –hard
  將工作樹中的內容和頭索引都切換至指定的版本位置中,也就是說自 <commit-ish> 之後的所有的跟蹤內容和工作樹中的內容都會全部丟失。因此,這個選項要慎用,除非你已經非常確定你的確不想再看到那些東西瞭。
  一個重要技巧--逆轉提交與恢復
Java代碼 
git reset 44b8f4ca48673291ee6fa77f7c076c476a86f5f2 –hard 

兩種類型的標簽
  在 git 中,有兩種類型的標簽,“輕標簽”和“署名標簽”。
  技術上說,一個“輕標簽”和一個分支沒有任何區別,隻不過我們將它放在瞭 .git/refs/tags/ 目錄,而不是 heads 目錄。因此,打一個“輕標簽”再簡單不過瞭。
  $ git-tag my-first-tag
  如果你打算針對某個commit ID來打標簽,雖然該命令可以通過gitk裡的右鍵菜單來實現,但是該命令對實際應用是很有幫助的。
  $ git-tag mytag f0af6283824688f9d23426031734657661b54388
  “署名標簽”是一個真正的 git 對象,它不但包含指向你想標記的狀態的指針,還有一個標記名和信息,可選的 PGP 簽名。你可以通過 -a 或者是 -s 選項來創建“署名標簽”。
  $ git-tag -s <tag-name>

在另一臺電腦上訪問並操作此git庫
Java代碼 
deanye@dean:~$ mkdir text 
deanye@dean:~$ cd text 
deanye@dean:~/text$ git clone ssh://deanye@10.100.13.126/home/deanye/workspaces 
Initialized empty Git repository in /home/deanye/text/workspaces/.git/ 

 

 


Java代碼 
修改文件如果需要提交可以提交的到git庫的某一個分支 
deanye@dean:~/text/workspaces$ git branch 
獲取當前分支名 
deanye@dean:~/text/workspaces$ git push ssh://deanye@10.100.13.126/home/deanye/workspaces/$REPO_PROJECT.git master:first 

 

 

Java代碼 
git中有四種對象:blob、tree、commit、tag。 
blob代表文件,tree代表目錄,commit代表提交歷史,tag代表標簽。 
這四種對象都是由SHA1值表示的。在倉庫的.git目錄中保存瞭git管理倉庫 
所需要的全部信息。 
git ls-tree HEAD file   顯示file在HEAD中的SHA1值。 
git cat-file -t SHA1    顯示一個SHA1的類型。 
git cat-file type SHA1  顯示一個SHA1的內容。type是blob、tree、commit、tag之一。 
patch: 
git format-patch -1     生成最後一個提交對應的patch文件。 
git am < patch          把一個patch文件加入git倉庫中。 
git am –resolved       如果有沖突,在解決沖突後執行。 
git am –skip           放棄當前git am所引入的patch。 
conflict: 
git merge               用於合並兩個分支。 
git diff                如果有沖突,直接使用diff查看, 
                        沖突代碼用<<<和>>>表示。手動修改沖突代碼。 
git update-index        更新修改後的文件狀態。 
git commit -a -e        提交為解決沖突而修改的代碼。 
  
branch: 
git branch -a           查看所有分支。 
git branch new_branch   創建新的分支。 
git branch -d branch    刪除分支。 
git checkout branch     切換當前分支。-f參數可以覆蓋未提交內容。 
  
daemon: 
有時更新公共代碼倉庫使用patch的方式,或者直接 
用git pull git://ip/repo branch 
的方式更新每個人的代碼。使用git pull的方式需要 
提交代碼的機器運行: 
git daemon –verbose –export-all –enable=receive-pack –base-path=/repo 
request-pull: 
git request-pull start url      用於產生本次pull請求的統計信息。 
  
clean: 
  
git clean -dxf          用於清除未跟蹤文件。 
git clean -dnf          可以顯示需要刪除的文件,但不包括被.gitignore忽略的。 
git reset –hard HEAD   用於清除跟蹤文件的修改。 
 
常量的使用方法 
 
HEAD:表示最近一次的commit。 
MERGE_HEAD:如果是merge產生的commit,那麼它表示除HEAD之外的另一個父母分支。 
FETCH_HEAD:使用git-fetch獲得的object和ref的信息都存儲在這裡,這些信息是為日後git-merge準備的。 
ORIG_HEAD:保存父節點的SHA-1值 
HEAD^:表示HEAD父母的信息 
HEAD^^:表示HEAD父母的父母的信息 
HEAD~4:表示HEAD上溯四代的信息 
HEAD^1:表示HEAD的第一個父母的信息 
HEAD^2:表示HEAD的第二個父母的信息 
COMMIT_EDITMSG:最後一次commit時的提交信息。

You May Also Like