【參考】http://www.cnblogs.com/schaepher/p/5561193.html
鏈接裏的大拿已經把git的教程寫的很詳細了,我提取幾條常用的命令備用,下面的命令需要對git有基本的瞭解,在命令或流程忘記時備用
備註:
1.origin:通常表示遠程主機名/遠程倉庫名(如定義了其他,請用其他名字替代)
2.master:默認分支名(主分支)
3.branchName:代指其他的分支名字,實際使用時請帶入真實的分支名字
4.FETCH_HEAD: 是一個版本鏈接,記錄在本地的一個文件中,指向着目前已經從遠程倉庫取下來的分支的末端版本
1、電腦第一次使用git時需要執行的命令:
1.設置用戶名(github網站的用戶名)
git config --global user.name "你的用戶名"
2.設置郵箱 (github網站的郵箱)
git config --global user.email "你的郵箱"
可以在在.gitconfig文件中直接配置
3、生成ssh key(和gitHub進行綁定使用),它會有三次等待你輸入,直接回車即可
ssh-keygen -t rsa -C "你的郵箱"
生成的ssh key複製到剪貼板,執行 clip < ~/.ssh/id_rsa.pub或直接根據提示查看路徑、打開id_rsa.pub文件複製,在gihub網頁上添加key。測試一下吧,執行
ssh -T [email protected]
看是否成功
對於 oschina 的 “碼雲” ,執行
ssh -T [email protected]
對於 coding 的 “碼市” ,執行
ssh -T [email protected]
2、初始化倉庫:init
1.在需要建立倉庫的文件夾下右鍵 點擊“Git Bash Here” 彈出窗口輸入
git init
會創建一個隱藏的文件夾 .git
3、新建、編輯文檔
vi xxx.xx
4、文件的添加、提交:add 、commit 、log、reflog
1.查看文件(數據)的是否被添加追蹤
git status
2.添加、追蹤文件到倉庫緩存空間(stage)(commit 前必須要 add)
添加具體的文件:git add <file>...
添加所有的文件:git add -A
添加結束後可以使用 命令“git status” 查看文件是否已經添加緩存
3.查看文件有哪些變化(+:新添加的 / -:刪除的數據)
git diff
4.提交到倉庫repository
git commit -m "提交信息/版本備註"
5.查看當前版本及之前的commit記錄
git log
帶圖形指示(查看節點之間的merge情況)
git log --graph
HEAD的變更記錄(所有記錄)
git reflog
5、撤銷當前更改
待測
git checkout -- .
6、版本回滾:reset 、revert
6.1、使用git log 查看commit版本號,複製版本號(不少於7位)
git reset --hard 版本號
執行後git log只能查看當前版本及之前的版本信息,HEAD 是向後移動,之後的版本信息無法查看,相當於時光倒流回之前的時間點。要回到最新的版本,git reflog 命令查看這個HEAD所在的(所有)版本號,提取對應的版本號,再一次執行git reset –hard 版本號命令即可恢復到最新。
7、清除未追蹤的文件:clean
刪除當前目錄下所有沒有track過的文件(待測)
git clean -xf
8、中文亂碼
如果會顯示中文亂碼:
git config --global core.quotepath false
執行之後還會亂碼
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8
請根據需要將後面的 utf-8 替換成你想要的編碼。如果是團隊項目,請確保所有成員的設置都一致
9、本地Git和Github的建立關聯、刪除關聯、查看倉庫信息:remote
1.建立關聯:在github網頁上的建立倉庫,並複製參考地址,HTTPS比較慢,所以推薦使用SSH
git remote add origin 你複製的github倉庫地址
2.刪除關聯:刪除名字爲origin的遠程倉庫
git remote rm origin
3.查看倉庫信息:查看遠程倉庫數據
git remote 不帶參數時可以參看遠程倉庫名稱
git remote -v 可以查看遠程倉庫名稱和網址
如果github上的倉庫已經有數據(添加了README.md 或者 LICENSE), github 會拒絕你的 push ,需要先執行
git pull origin master
將倉庫上的數據pull下來後再執行
git push -u origin master
10、git和github數據交互:push、pull / fetch
執行9步驟後以後可以直接
1.push數據到github
1.1.push當前分支到github
git push
1.2.push < branchName >這個分支到github的branchName 上,如果遠程分支不存在,則會被新建:git push <遠程主機名> <本地分支名>
git push origin branchName
1.3.push < branchName >這個分支到github的branchNameX上,如果遠程分支不存在,則會被新建:git push <遠程主機名> <本地分支名>:<遠程分支名>
git push origin branchName:branchNameX
2.fetch 數據到本地(fetch和pull有那麼一點繞,需要花點時間理解,實際使用時也需要花點時間磨合,感知變化)
— 將遠程分支的最新內容拉到了本地,但是fetch後是看不到變化的
— 理解fetch,關鍵是理解FETCH_HEAD,FETCH_HEAD指的是:某個分支在服務器上的最新狀態
2.1.不指定分支時通常默認爲master分支,更新master的FETCH_HEAD,並沒有與本地的分支合併
git fetch origin
or
git fetch origin master
2.2.指定了分支,更新該分支的FETCH_HEAD,只拉取該分支的最新狀態,並沒有與本地的分支合併,同時也可以測試遠程分支branchName是否存在
git fetch origin branchName
2.3.執行2.1或2.2後:checkout到相應的分支,merge 合併,合併後如果出現衝突則手動解決衝突,最後commit
git merge FETCH_HEAD
or
git merge origin/branchName (待測) / git rebase origin/branchName (待測)
2.4.在本地新建一個branchNameX分支,並將遠程倉庫的branchNamer分支代碼下載到本地branchNameX分支(不存在則創建,但不會切換到該分支):git fetch <遠程倉庫> <遠程分支名>:<本地分支名>,
git fetch origin branchName:branchNameX
3.pull 數據到本地
3.1、執行後發現也是不會創建本地分支,數據也是更新到FETCH_HEAD,執行git log可以獲取到最新的commit_id,使用reset命令切換到最新版本:git pull <遠程主機名> <遠程分支名>
git pull origin branchName
3.2、取回遠程主機某個分支的更新後再與本地的指定分支合併即會將本地庫更新至遠程庫的最新狀態:git pull <遠程主機名> <遠程分支名>:<本地分支名>
git pull origin branchName:branchNameX
git pull是git fetch和git merge兩個步驟的結合,與git pull相比git fetch相當於是從遠程獲取最新版本到本地,但不會自動merge。如果需要有選擇的合併git fetch是更好的選擇。效果相同時git pull將更爲快捷
備註:測試了幾次,如果實際的代碼數據並沒有變化,可以嘗試使用git log查看commit_id,使用reset命令切換到相應的版本
pull和fetch的關係參考:
https://blog.csdn.net/a19881029/article/details/42245955/
https://www.jianshu.com/p/d265f7763a3a
11、分支:建立/切換/查看/刪除、分支合併和衝突解決、分支重命名:branch、checkout 、merge
1.git checkout -b 分支名字 = (建立分支)git branch 分支名字 + (切換分支)git checkout 分支名字
建立並切換到分支 :git checkout -b branchName
=
建立分支:git branch branchName
+
切換分支:git checkout branchName
2.查看分支
查看本地分支
git branch
查看遠程分支
git branch -r
查看所有分支,遠程分支會用紅色表示出來(如果你開了顏色支持的話)
git branch -a
git branch -av(帶V,可以查看分支信息)
3.刪除分支(master(默認分支)無法刪除、工作於某分支下時無法刪除該分支)
刪除本地分支:git branch -d branchName
刪除遠程分支:法1:git push origin :branchName
刪除遠程分支:法2:git push origin --delete branchName
4.合併某個分支到現在的所處的分支
git merge 需要被合併的分支名字
合併分支可能會存在衝突、Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
<<<<<<< HEAD
code1[ ... ]
// 這裏的代碼是當前分支中的代碼數據
=======
code2[ ... ]
// 這裏的代碼是需要被合併的分支中的數據
>>>>>>> branchName
需要手動將上面標記出來的衝突代碼數據進行根據需要進行修改,然後執行 git add / commit 命令,完成分支合併。最後刪除分支。
使用帶參數git log 查看分支合併情況
git log --graph --pretty=oneline --abbrev-commit
鏈接描述對分支合併衝突解決的方法:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840202368c74be33fbd884e71b570f2cc3c0d1dcf000/
5.分支重命名
git中重命名遠程分支,其實就是先刪除遠程分支,然後重命名本地分支,再重新提交一個遠程分支
git push --delete origin branchName (刪除遠程分支)
git branch -m branchName branchNameNew (重命名本地分支)
git push origin branchNameNew (重新提交一個遠程分支)
默認分支是無法刪除的,需要把默認分支修改爲其他分支纔可以刪除:修改默認分支步驟:
1.進入 github 中該項目的 Settings 頁面;
2.在Brabchs下設置 Default Branch 爲其他的分支(例如 master);
2.重新執行刪除遠程分支命令
12.tag 創建、推送、獲取、刪除
— tags是branch中的一些小階段的標記,tag就像是一個里程碑一個標誌一個點,branch是一個新的征程一條線;
— tag是靜態的,branch要向前走。
— tags它其實是一個獨立的分支,或者說是一個不可變的分支.指向特定提交對象的引用,多用於版本發佈
https://www.cnblogs.com/senlinyang/p/8527764.html
https://blog.csdn.net/liuchunming033/article/details/52194734
12.1、創建tag
git tag tagname
創建帶註釋的tag
git tag -a tagname -m "備註信息"
註解:git tag 是打標籤的命令,-a 是添加標籤,其後要跟新標籤號,-m 及後面的字符串是對該標籤的註釋
12.2、刪除tags
git tag -d tagname (本地)
git push origin -d tagname (遠程)
git push origin :refs/tags/tagname
註解:就像git push origin :branch_1 可以刪除遠程倉庫的分支branch_1一樣, 冒號前爲空表示刪除遠程倉庫的tag
12.3、把本地tag推送到遠程
git push origin tagname (單個)
git push --tags (多個tags推送)
12.4、獲取遠程tag
git fetch origin tag tagname
查詢本地tag.
git tag (-l)(顯示當前所有tag的名稱)
git show tagname (顯示某個tag的詳細信息)
git tag "tagname*"(顯示內容和tagname匹配的多個tag)
13、clone
一個空的,乾淨的文件夾下從github上clone一個分支
13.1、git clone 默認是克隆Head指向的branch,默認是master分支
git clone [email protected]:xxxxx.git
13.2、單獨clone某個指定分支
git clone -b branchName [email protected]:xxxxx.git
有分支後就可以去獲取其他分支了
git branch -a
git checkout -b branchName origin/branchName
作用是checkout遠程倉庫origin的分支branchName,在本地起名爲branchName分支,並切換到本地的branchName分支,其實-b後面的aaa可以隨意設置