學習記錄----git學習點滴
達成目標:通過github基礎操作,學會使用Github去管理在線環境中使用的代碼、配置、資源等實驗相關文件,去添加、同步和下拉在遠程倉庫中的實驗文件,以此來維持自身的實驗進度
1、SSH公私鑰生成: ssh-keygen 命令(一路回車),生成的命令默認保存在.ssh(隱藏的)文件夾下,分為id_rsa(私鑰)和id_rsa.pub(公鑰)
2、創建github賬號(已有忽略此步驟),首頁——Start a project---勾選Public(默認已勾選)--勾選Initialize this repository with a README----Create repository--完成創建
4、安裝Git工具:yum 安裝
5、配置用戶名與郵箱:get config --global user.name 用戶名
get config --global user.email 郵箱
執行這兩個命令後,會在當前目錄下生產一個隱藏的文件 .gitconfig ,內容是name和email
改文件是Git全局配置文件,一般配置方法是: git config --global 配置名稱 配置的值
基礎配置好後,接下來是實驗步驟:
創建並初始化Git倉庫:
1、創建代碼目錄 ,如:mkdir project
2、切換到代碼目錄,並初始化Git倉庫:cd project ; git init
3、ls -al 查看到會創建一個隱藏的 .git 目錄,意味著一個倉庫被初始化了
克隆遠程倉庫(Github上的倉庫)到本地個人PC:
點擊Clone or download按鈕--選擇Use SSH 或 Use HTTPS--點擊復制按鈕,復制鏈接
查看當前git倉庫的狀態(需要先切換到當前的git倉庫): git status
Untracked 狀態表示文件未加入本地緩沖區
查看緩存區中哪些文件被修改了(差別): git diff --cached ,輸入q才可以退出這個狀態
如果沒有--cached參數,git diff 會顯示當前你所有已做的但沒有加入到索引裏的修改
也可以加上路徑限定符,來只比較某一個文件或目錄:如:git diff 分支名 文件名/路徑名
--stat 參數可以統計一下有哪些文件被改動,有多少行被改動
將本地倉庫與遠程倉庫關聯(針對於使用git init初始化的本地倉庫):
git remote add origion git倉庫地址
git remote add 命令用於添加遠程主機,origin 是主機名,我們可以自定義
git 倉庫地址 是自己的遠程倉庫地址(即github倉庫地址)
如:git remote add origin https://github.com/yingque/novel_insect.git
克隆命令: git clone 要復制的倉庫鏈接
Git URL可能以ssh://, http(s)://, git:// 開頭
如果使用的是Zsh shell,則zsh會自動把目前所在的git分支顯示在提示符中
本地查看克隆下來的倉庫內容: cd 倉庫名---ls
添加實驗文件到本地索引庫:git add 文件名/路徑名
例如: echo “文件內容” >> 文件名 #先創建文件
git add 文件名 #先將文件移動到倉庫下,再添加到本地索引庫中
刪除倉庫(本地)裏的文件:git rm [rm參數選項] 文件名/路徑名
撤銷:即將本地倉庫裏的改動撤銷回到從git克隆下來的狀態(如果改動之後執行了提交動作就無法再撤銷,只能從遠程倉庫重新克隆一份到本地)
git reset --hard HEAD (在本地倉庫目錄下輸入此命令行)
提交倉庫的改動:git commit -m 提交的備註信息
推送改動到遠程倉庫中(必須先提交改動):git push [-u] origin 分支名
分支名默認為master;第一次推送改動可以使用-u參數,使用後會綁定這次的倉庫分支名,這樣下一次推送就不需要加上分支名了
本地查看遠程倉庫的改動(更新): git fetch origin (在本地倉庫目錄下輸入此命令行)
下拉倉庫同步:git pull origin 分支名 分支名默認為master
git的基本流程如下:
1、創建或修改文件
2、使用git add命令添加新創建或修改的文件到本地的緩存區(Index)
3、使用git commit命令提交到本地代碼庫,加-m參數,後接“備註”
4、(可選,有的時候並沒有可以同步的遠端代碼庫)使用git push命令將本地代碼庫同步到遠端代碼庫
需要註意的是如果是修改文件,也需要使用git add命令添加到緩存區才可以提交。如果是刪除文件,則直接使用git rm命令刪除後會自動將已刪除文件的信息添加到緩存區,git commit提交後就會將本地倉庫中的對應文件刪除
Git的分支與合並:
Git的分支可以讓你在主線(master分支)之外進行代碼提交,同時又不會影響代碼庫主線
1、創建分支: git branch 分支名 ;
-d 參數是刪除分支;如: git branch -d 分支名
git branch 可查看當前的分支列表,以及目前的開發環境處在哪個分支上;
- 代表當前在哪個分支下
2、切換分支: git checkout 分支名
3、分支的合並: git merge -m ‘merge 分支名 branch’ 分支名
-m 參數是需要填寫合並的註釋信息
如果兩個分支都修改了同一個文件,則合並時會失敗
合並失敗後先用git status查看狀態,會發現文件顯示為both modified
手動解決沖突的流程:使用vim編輯沖突的文件,去掉git在自動產生標註沖突的<<<<<<等符號,根據需要只保留我們需要的內容後保存,然後使用git add 文件名和git commit-m 文件名 命令來提×××並後的文件內容
4、當不再需要分支時,使用 git branch -d 分支名 刪除分支即可
git branch -d只能刪除那些已經被當前分支合並的分支. 如果你要強制刪除某個分支的話就用git branch –D
5、撤銷一個合並:git reset --hard HEAD
6、查看日誌:git log 顯示所有的提交(commit),按q退出,按回車會逐行顯示
Man git log 或 git help log 可查看git log 使用幫助
7、日誌統計:git log --stat 會顯示在每個提交(commit)中哪些文件被修改了,這些文件分別添加或刪除了多少行內容,這個命令相當於打印詳細的提交記錄
8、格式化日誌:git log --pretty=oneline 或 git log --pretty=short
也可用medium,full,fuller,email 或raw。 如果這些格式不完全符合你的需求, 你也可以用--pretty=format參數定義格式
9、日誌排序:要指定一個特定的順序,可以為git log命令添加順序參數;默認情況,提交
按逆時間順序顯示,可以指定 --topo-order 參數,讓提交按拓撲順序來顯示
如: git log --pretty=format:’%h : %s’ --topo-order --graph
--reverse 參數來逆向顯示所有提交日誌
公共Git倉庫:
如果你和維護者都在同一臺機器上有帳號,那麽你們可以互相從對方的倉庫目錄裏直接拉所作的修改,git命令裏的倉庫地址也可以是本地的某個目錄名:
如:git clone /path/to/repository
git pull /path/to/other/repository
也可以是一個ssh地址:git clone ssh://yourhost/~you/repository
將修改推到一個公共倉庫:
用git push命令,推送本地的修改到遠程Git倉庫,執行下面的命令:
$ git push ssh://yourserver.com/~you/proj.git master:master
或者
$ git push ssh://yourserver.com/~you/proj.git master
git push命令的目地倉庫可以是ssh或http/https協議訪問
推送代碼失敗時,推送結果不是快速向前fast forward,報錯時,先 git pull 下獲取遠端倉庫的最新更新
Git標簽:
創建輕量級標簽:用git tag 不帶任何參數創建一個標簽(tag)指定某個提交(commit)
先使用git log 查看顯示結果中commit 後字符的前8位
git tag 標簽名(自定義) 前8位字符
Git tag 查看當前已有的tag
如: git tag stable-1 8c315325
標簽對象:為一個tag添加註釋,或是為它添加一個簽名
git tag 後接 -a , -s ,或是 -u 三個參數中任意一個,都會創建一個標簽對象,並且需要一個標簽消息(tag message)來為tag添加註釋;如果沒有-m 或是 -F 這些參數,命令執行時會啟動一個編輯器來讓用戶輸入標簽消息
當這樣的一條命令執行後,一個新的對象被添加到Git對象庫中,並且標簽引用就指向了一個標簽對象,而不是指向一個提交,這就是與輕量級標簽的區別
如: git tag -a stable-2 8c315325 -m “stable 2”
簽名的標簽: 簽名標簽可以讓提交和標簽更加完整可信。如果你配有GPG key,那麽你就很容易創建簽名的標簽。首先你要在你的 .git/config 或 ~/.gitconfig 裏配好key
示例:[user]
signingkey = <gpg-key-id>
或用命令行來配置:
git config (--global) user.signingkey <gpg-key-id>
現在你可以在創建標簽的時候使用-s 參數來創建“簽名的標簽”:
$ git tag -s stable-1 1b2e1d63ff
如果沒有在配置文件中配GPG key,你可以用-u參數直接指定。
$ git tag -u <gpg-key-id> stable-1 1b2e1d63ff
通過在頂層工作目錄中添加一個叫 .gitignore的文件,來告訴Git系統要忽略掉哪些文件
git命令合集:
git init repo #初始化一個叫repo的本地git倉庫
#實際上就是創建一個repo的目錄,然後目錄下放一個.git,.git包含了git的所有記錄,判斷一個目錄是否為git倉庫,就看有沒有.git目錄,有.git目錄往下都屬於同一個git倉庫 #如果你把.git這個目錄刪除了,你的代碼雖然還在,但是你的歷史變更記錄就全部沒有了,所以一般別動這個.git
git add file #往暫存區添加一個叫file的文件
git diff #對比修改內容和git中最新記錄的commit的區別,最好在add之前用git diff看一看,避免一些像加了空白鍵那種無效提交
git add . #往暫存區添加在git status中提示需要add的文件(git status不會提示被.gitignore忽略的文件)
git commit -m "blablabla" #把暫存區的內容正式提交到本地的當前分支,其中那個blablabla就是對本次提交的說明
git commit # 最近實踐發現加了-m,我會盡可能擠成一行來寫,但是push到github後,查看commit的時候就發現寫的記錄信息全部擠在一行,難看死了,有些還被忽略了 # 所以不如直接git commit記錄比較全面的信息 # 不過之前得先指定git config --global core.editor /usr/bin/vim,不然貌似默認用的是vi,vi的話就有可能在你保存的時候會崩潰 # 以至於你寫的一堆提交信息全沒了.#git commit 還有一個-a的選項,是表示連同未add的文件改動也一同加進來,因為你可能add以後又改動了文件,而一般你前面add了內容就只用-m就可以了,不用-am
git status #查看當前所在git倉庫情況
git log #查看提交歷史,你會看到你自己之前commit時候的說明,各種blablabla
git reflog #查看操作歷史
git clone HTTPS/SSH #克隆一個項目 # 常見的要麽就是長成https型的(e.g. https://github.com/tesseract-ocr/tesseract.git) # 要麽就是長成ssh型的(e.g. [email protected]:tesseract-ocr/tesseract.git)
git remote -v #查看遠程代碼倉庫的信息
git remote add origin HTTPS/SSH #添加一個叫origin遠程倉庫地址,一般克隆自帶,如果是本地新創建的話就得執行這句,然後才能push
git remote remove origin #刪除一個叫origin遠程倉庫地址
git push origin <本地分支>:<遠程分支> #如果沒有冒號後面的,此時默認推送到遠程origin倉庫的與<本地分支>同名的分支,如果不存在,則會被新建
git fetch --all #這條命令一般用於如果有人遠程push了一條分支到repo,你本地想要拉下來,直接checkout提示本地沒有,就可以fetch全部分支了~
git pull origin <遠程分支>:<本地分支> #如果沒有冒號後面的,此時默認拉取並合並遠程倉庫origin的 <遠程分支>到當前分支,pull相當於fetch+merge
git pull --rebase origin dev <遠程分支>:<本地分支> #拉取遠程git代碼倉庫origin的dev分支更新,並以重建的方式合並到本地分支 #一般要是嫌麻煩,就像上面那樣直接pull就好了,有些潔癖者喜歡用rebase保證本地的線性幹凈,本地可以rebase,遠程就別這麽做了
git merge --no-ff dev master #合並本地dev分支到master分支,潔癖者會為了幹凈歷史加上--no-ff選項(--no-ff意思是no fast forward非快進式合並,某公司面試問了--no-ff含義)
git merge --no-ff dev #合並本地dev分支到本地當前分支,潔癖者會為了幹凈歷史加上--no-ff選項 #沖突解決:在pull 和merge的時候會因為合並雙方文件內容不一樣而導致沖突,它會顯示給你發生沖突的文件,並自動在沖突文件中標註好不一樣的段落 #解決沖突其實已經有很多很好的工具了(比如vimdiff之類的),但是我覺得這些工具都稍顯得復雜不簡約,所以我推薦直接用vim打開發生沖突的腳本,手動修改好,保存 #用vim修改(sublime也不錯)清晰方便,再add==>commit==>push就沒問題了(第二次push是以你修改後提交為準,git這時候並不理會遠程倉庫的文件內容,直接覆蓋過去~) #或者修改好沖突以後就git add沖突的文件,再git merge --continue或者git rebase --continue,省去了commit的功夫
git branch #顯示本地所有分支
git branch -D dev #-D是-d --force的shotcut,強制刪除dev本地分支
git push origin :dev #刪除遠程倉庫的dev分支,相當於把一個空分支push到遠程倉庫的dev上,等同於刪除該分支。
git checkout -b dev #切換到dev分支,-b是沒有dev分支時候才需要加上去的,這種情況下是創建並切換到dev分支的意思
git checkout -- file #撤銷工作區中一個叫file的文件的修改
git reset HEAD file #撤銷暫存區中一個叫file的文件到工作區中
git reset --hard HEAD^ #回滾當前分支到上一個版本,註意末尾的^,有n個^說明回滾多上個版本,也就是回到多少次commit前 #貌似把上面的file 換成(wildcard)通配符來代指所有是可以的.我就經常多文件撤銷工作區修改的時候git checkout -- ,純粹因為懶得一個個輸入...
git stash 緩存工作區修改
git stash list 當前的git stash棧打印出來
git stash pop 恢復所緩存內容
git stash clear 清除全部所緩存內容
git stash pop 相當於 git stash apply 加 git stash drop
學習記錄----git學習點滴