gitlab的基本操作--上傳、下載、庫的遷移/備份及回收/重命名
- gitlab基本概念
GitLab是一個基於 Web 的 Git 倉庫管理工具,且具有wiki 和 issue 跟蹤功能。GitLab 由 GitLab Inc. 開發,使用開源許可證。
GitLab 由烏克蘭程序員 Dmitriy Zaporozhets 和 Valery Sizov 開發。它由 Ruby 寫成。後來,一些部分用Go語言重寫。截止2016年12月,該公司有150名團隊成員,以及1400多名開源貢獻者。 GitLab被 IBM,Sony,Jülich Research Center,NASA,Alibaba,Invincea,O’Reilly Media,Leibniz-Rechenzentrum (LRZ),CERN,SpaceX 等組織使用。 - gitlab庫創建
點擊“New project”
按照上面步驟,最後點擊“Create project” - 文件上傳
在客戶端上(mac本的遠程終端上)進行如下操作: Git global setup git config --global user.name "wtf" git config --global user.email "[email protected]" git clone ssh://[email protected]:19234/linux/linux_datagrand.git cd linux_datagrand echo "this is a test file." > wtf.txt cat wtf.txt this is a test file ! git add . git commit -m "add a file named wtf.txt" git push -u origin master 這樣就可以將客戶端文件上傳到gitlab的倉庫裏了。
- 文件下載
如果我在gitlab上linux_datagrand.git這個倉庫裏進行如下操作: 添加shiyan.txt和目錄test這兩個文件,那麽我在客戶端應該怎麽操作才能將新增的文件“拉取”到本地呢? cd linux_datagrand git pull 或 git pull --rebase origin master 說明:建議使用git pull,原因我會在下文說明。 cat linux_datagrand wtf.txt shiyan.txt test
- 在存在的文件下進行文件遞交
如果我在終端上有個目錄文件existing_folder,裏面的文件需要遞交至git庫,而你又不想cp到目標庫再push,那麽你可以這樣做: cd existing_folder git init git remote add origin ssh://[email protected]:19234/linux/linux_datagrand.git git add . git commit -m "Initial commit" 在push之前先進性pull操作: git pull --rebase origin master 如果不進行pull這一步,會報如下錯誤: error: failed to push some refs to git。 然後: git push -u origin master
- 庫的遷移或備份
##如我想把linux_datagrand.git這個庫裏的文件遷移至daguan.git這個新庫中,要求如下: (1)遷移的時候就要考慮到已有的分支; (2)保留以前的提交記錄; (3)不要把本地的代碼直接提交到gitLab,這樣以前提交的記錄和分支就都沒有了。 ##操作如下: git clone ssh://[email protected]:19234/linux/linux_datagrand.git cd linux_datagrand ls name.txt shiyan.txt ##查看當前的遠程倉庫: git remote -v origin ssh://[email protected]:19234/linux/linux_datagrand.git (fetch) origin ssh://[email protected]:19234/linux/linux_datagrand.git (push) ##添加daguan.git這個遠程倉庫 git remote add test ssh://[email protected]:19234/linux/daguan.git 說明:添加遠程倉庫的格式: git remote add 倉庫名字 [倉庫地址] ##查看當前的遠程倉庫: git remote -v origin ssh://[email protected]:19234/linux/linux_datagrand.git (fetch) origin ssh://[email protected]:19234/linux/linux_datagrand.git (push) test ssh://[email protected]:19234/linux/daguan.git (fetch) test ssh://[email protected]:19234/linux/daguan.git (push) ##把本地的分支push到遠程倉庫 git push -u test master 這個時候有報錯,內容如下: error: failed to push some refs to ‘ssh://[email protected]:19234/linux/daguan.git‘ hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., ‘git pull ...‘) before pushing again. hint: See the ‘Note about fast-forwards‘ in ‘git push --help‘ for details. ##解決方法: (1)由於GitLab一些分支默認被保護,僅僅擁有master級別的用戶才能提交到保護分支,而且master分支默認是保護分支,其他用戶需要通過合並issue請求來提交上去。所以我們先關閉這個master分支保護: Project: "Settings" -> "Repository" -> “Protected Branches(Expand)” -> "Unprotect"。 (2)使用命令:git push -f test master 所以把本地的分支push到遠程倉庫命令: git push -f test master ##這個時候,我們已經把linux_datagrand.git這個庫裏的文件遷移至daguan.git這個新庫中了。
- 庫的回收和重命名
有的時候庫遷移完成之後,老的庫就不需要了,這個時候就需要我們去回收或重名了,接著上面的實例說明: 要求如下: (1)我已經把linux_datagrand.git這個庫裏的文件遷移至daguan.git這個新庫中了,那麽我不想再使用git clone ssh://[email protected]:19234/linux/daguan.git 建立本地庫; (2)我想把linux_datagrand.git這個本地庫更改為daguan.git 操作如下: cd linux_datagrand ##先刪除原先的origin git remote remove origin ##查看當前遠程倉庫 git remote -v test ssh://[email protected]:19234/linux/daguan.git (fetch) test ssh://[email protected]:19234/linux/daguan.git (push) ##我們一般都習慣使用origin,所以更改一下test這個名稱 命令格式: git remote rename <old> <new> git remote rename test origin ##再查看當前遠程倉庫 git remote -v origin ssh://[email protected]:19234/linux/daguan.git (fetch) origin ssh://[email protected]:19234/linux/daguan.git (push)
-
git pull 和 git pull --rebase
##說明:
Git 作為分布式版本控制系統,所有修改操作都是基於本地的,在團隊協作過程中,假設你和你的同伴在本地中分別有各自的新提交,而你的同伴先於你 push 了代碼到遠程分支上,所以你必須先執行 git pull 來獲取同伴的提交,然後才能 push 自己的提交到遠程分支。而按照 Git 的默認策略,如果遠程分支和本地分支之間的提交線圖有分叉的話(即不是 fast-forwarded),Git 會執行一次 merge 操作,因此產生一次沒意義的提交記錄,從而造成了遞交圖像的混亂。
##解決:
其實在 pull 操作的時候,,使用 git pull --rebase 選項即可很好地解決上述問題。 加上 --rebase 參數的作用是,提交線圖有分叉的話,Git 會 rebase 策略來代替默認的 merge 策略。 使用 rebase 策略有什麽好處呢?借用一下 man git-merge 中的圖就可以很好地說明清楚了。
假設提交線圖在執行 pull 前是這樣的:A---B---C remotes/origin/master / D---E---F---G master
如果是執行 git pull 後,提交線圖會變成這樣:
A---B---C remotes/origin/master / D---E---F---G---H master
結果多出了 H 這個沒必要的提交記錄。如果是執行 git pull --rebase 的話,提交線圖就會變成這樣:
remotes/origin/master | D---E---A---B---C---F‘---G‘ master
F G 兩個提交通過 rebase 方式重新拼接在 C 之後,多余的分叉去掉了,目的達到。
##結論:
大多數時候,使用 git pull --rebase 是為了使提交線圖更好看,從而方便 code review。
不過,如果你對使用 git 還不是十分熟練的話,我的建議是 git pull --rebase 多練習幾次之後再使用,因為 rebase 在 git 中,算得上是『危險行為』。
另外,還需註意的是,使用 git pull --rebase 比直接 pull 容易導致沖突的產生,如果預期沖突比較多的話,建議還是直接 pull。
gitlab的基本操作--上傳、下載、庫的遷移/備份及回收/重命名