git用于管理代碼的不同版本,能夠很快恢復到過去時間段的某個狀態(tài)。同時在多人合作共同開發(fā)中伏恐,對于代碼的修改與發(fā)送,都非常的輕快便捷栓霜,不同像在QQ群之間相互傳代碼的zip壓縮包那樣麻煩翠桦;不會疑惑其他人對代碼做了哪些修改。Github/Gitee是運用互聯(lián)網(wǎng)的思維胳蛮,將代碼存儲在上面销凑,通過互聯(lián)網(wǎng),我們才能夠相互將代碼分享仅炊。
而對于如何使用git來管理代碼斗幼,這還需要熟悉一些原理與git命令操作,這樣才會得心應(yīng)手抚垄。
Git功能
- Tracking multiple files together
- Tracking change
- Tracking history version (tracking 跟蹤)
本機離線操作
在自己的電腦上管理代碼local,其中涉及到三個空間概念: working directory存儲在硬盤上的普通文件,staging area與add有關(guān)和repository與commit有關(guān)
concept map
git -version
查看git的版本
git log
查看提交的日志蜕窿,其中那一串數(shù)字是commitID指向每個歷史版本,按照時間從現(xiàn)在往之前推谋逻。q退出。
git log --graph --oneline
查看分支合并情況,類似圖形界面
也可查看專門的分支
git log --graph --oneline master 分支名稱
git diff
git diff commitID(之前) commitID(之后)
比較在repository中兩個版本的不同渠羞,如取3aa08b92180bea3f594340f87d0d51e4a99edd87與d07738fb19f551ea8d767f9fde6c4b702d0923ef進行比較斤贰,通過顏色或(-,+)等信息觀察變化次询,可以只輸入前面四個字符即可
表示新添了內(nèi)容,該內(nèi)容是新信息
git diff
場景: 該文件已經(jīng)通過add加入到了staging area但是未加入到repository,而此時你去處理別的事情了(比如上廁所)瓷叫,回來的時候你想知道staging area的文件是否是最新的文件屯吊,因為你可能忘了,將該文件加入staging area后你是否又修改了該文件摹菠。
比較的是同文件在working area與staging area的狀態(tài)
git diff --staged
比較的是staging area與repository中最新的”快照”
git checkout
git checkout master
回到主分支
git checkout 分支名稱
該分支可以是本地的分支盒卸,也可以是遠程的分支
切換到該分支
git checkout commitID
access old versions of files.可以回到這個commitID指向的當時版本。使用它次氨,我們可以查看bug在那一次提交引入的蔽介。
git init
將一個文件夾初始化為一個 git repository(git 倉庫)
git status
查看當前的文件狀態(tài),是否是添加到repository中還是在staging area狀態(tài)
git add
將文件加入到staging area準備提交到本地的repository
git add . 表示將全部文件添加到staging area中
git add 文件名 只將該文件加入
git commit
A commit is a snapshot of git repository(快照)
提交commit會記錄打log日志中煮寡,為了日后方便通過日志來跟蹤代碼的更改虹蓄,應(yīng)該遵循的原則是:
It‘s make one commit per logical change and give each commit a good message.(每跟換一次邏輯,進行一次提交)
git commit直接回車會打開sublime編輯器幸撕,進行更加詳細的信息編輯(前提是需要配置sublime)
也可以使用git commit -m "message"在命令行快速寫入信息
配置sublime
切換到Home目錄下
cd ~
在Home路徑下創(chuàng)建.bash_profile文件,在文件中添加薇组,sublime的安裝路徑,注意轉(zhuǎn)義
alias subl="C:/Program\ Files/Sublime\ Text\ 3/sublime_text.exe"
以后就可以在bash下使用subl 文件名來打開文件進行編輯
git branch
git branch
查看當前有哪些分支
git branch 分支名稱
創(chuàng)建該分支
為什么創(chuàng)建分支
比如開發(fā)一個游戲正版的難度是3星坐儿,但是你覺得太難律胀,于是想改代碼實現(xiàn)一個2星級別的,但是正式版本是3星貌矿,你能讓正式版本變成2星炭菌,于是你需要在這個基礎(chǔ)上開一個分支,在該分支上你可以自己改寫代碼而不用影響主支master的代碼逛漫。換而言之黑低,你可以在分支上干自己想干的事,大膽的更改代碼尽楔,而不用擔心影響主分支master
git branch -d 分支名稱
刪除分支
git merge
合并分支投储,將兩個分支上的代碼,合并整合到一個分支上阔馋,其中不可避免的時conflict(沖突)
git merge branch1 branch2
將分支branch2合并到branch1
相當于 git checkout branch1 然后 git merge branch2
git merge --abort
取消合并
沖突問題
當沖突發(fā)生時玛荞,查看發(fā)生沖突的文件,這時候兩個分支都是對原來的狀態(tài)進行了修改呕寝,需要打開文件進行改寫勋眯。如:
打開subl hello.txt文件,處理沖突:
<<<<<<< HEAD 表示HEAD指向的當前分支,此時為: different-oil
different information.
||||||| merged common ancestors 表示原始的內(nèi)容客蹋,此時表示原來是空的
=======
master money
>>>>>>> master 表示master分支改動的地方
以上信息表示塞蹭,master與different-oil都對原來的hello.txt狀態(tài)進行了內(nèi)容的增添,所以我們處理成這樣,將兩個分支添加的內(nèi)容都添加進來讶坯。
different information.
master money
git show commitID
因為兩個分支合并后番电,commit的時間是交錯的,要想查看這個commit的快照與在合并之前的分支上的前一個commit快照的對比辆琅,這個命令可以做到漱办。
compare a commit to its parent
Fast-forward-Merges
merging into is an ancestor of the branch that you're merging from
Github與本地local
Concept Map
SSH Key
在 ~/.ssh目錄下
$ ssh-keygen -t rsa -C "xxxxxxx@qq.com" -f "github_id_rsa"
$ ssh-keygen -t rsa -C "xxxxxxx@qq.com" -f "gitee_id_rsa"
ssh -T git@gitee.com
ssh -T git@github.com
git remote
git remote
顯示本地倉庫與遠程Github倉庫上的連接
git remote -v 顯示詳細信息 v指verbose
git remote add origin git@...
將自己本地倉庫與github倉庫關(guān)聯(lián)起來婉烟。(在github上新建一個repository最好勾選上README.md這樣會產(chǎn)生第一次提交娩井,然后在本地倉庫執(zhí)行該命令)注意與git clone的區(qū)別
關(guān)聯(lián)之后就可以使用 git push origin master 或 git push origin 分支 往github上提交文件了。(前提是要分配好SSH Key密鑰) 其中origin代表遠程
git remote add
git clone git@...
將github上的倉庫克隆下來似袁,作為本地的倉庫洞辣。
git pull
當遠程的Github倉庫的內(nèi)容改變時。
拉取Github上的代碼與本地倉庫的代碼進行合并昙衅。
如果倉庫只有自己一個人使用扬霜,那么在線上即Github上更改了某個文件,此時就需要git pull origin master遠程的代碼下來绒尊,進行合并畜挥,解決沖突。更常見的情況是婴谱,多人向一個倉庫貢獻代碼蟹但,此時在你就需要pull遠程,在本地解決沖突后谭羔,在pull request到貢獻的倉庫华糖。
git pull origin master 相當于 依次執(zhí)行了 git fetch origin 和 git merge master origin/master
fork
這是在github通過fork其他人的倉庫,將該倉庫復制到自己github上的倉庫中瘟裸。
fork & clone & branch之間的區(qū)別
pull request
這個是在github上操作的客叉,表示向fork的項目貢獻代碼。如: 在自己本地倉庫(clone的fork的那個倉庫)中創(chuàng)建了一個分支话告,在該分支上我們進行代碼修改兼搏,然后將分支提交到我們fork的到自己github的倉庫,然后在自己的github上的這個倉庫上進行pull request.
當我們進行pull request后沙郭,fork的原來的項目的主人會受到信息佛呻,然后查看你pull request過去的版本是否符合要求,然后決定是否合并到他的項目master中病线。
pull request沖突
如:
1) 在自己的分支上修改吓著,pull request到fork的原生項目時,發(fā)現(xiàn)有沖突
2) 在自己本地倉庫中切換到master主分支鲤嫡,然后git pull拉取遠程fork的倉庫的master,因為我們修改代碼都是在其他分支上绑莺,master主分支與遠程的master合并時是Fast-forward merges,一般不會有沖突暖眼。
git pull 遠程fork的SSH地址
或者
git remote add upstream 遠程fork的SSH地址 //這個只執(zhí)行一次就好
git pull upstream master //以后再拉取遠程fork倉庫的代碼時,就執(zhí)行這個即可
3)將master更新git push orgin master到自己github的倉庫
4)切換到分支纺裁,與master進行合并诫肠,解決沖突,在提交到自己的倉庫对扶,進行pull request
各個空間的改變
Courses
Problem
git pull
Problem-1
fatal: refusing to merge unrelated histories
git pull origin master --allow-unrelated-histories
Problem-2
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details
git pull <remote> <branch>
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream develop origin/<branch>
git pull origin master