題外話:
本人個人博客www.kurby.top 歡迎訪問。以後博客都會同步到個人博客和CSDN上,CSDN只作爲技術的分享,個人博客會多一些內容,當做我個人的小屋。如有興趣,歡迎訪問。
廖雪峯‘s Git
文章目錄
- 廖雪峯‘s Git
- Git的誕生
- Git的安裝
- 上傳文件放到Git倉庫
- 遠程倉庫
- 添加遠程倉庫
- 從遠程倉庫克隆到本地
- 分支管理
- git checkout -b xxx 或 git switch -c xxx
- git branch xxx
- git branch -d XXX
- git branch
- git checkout xxx 或 git switch xxx
- git merge
- git log --graph
- git merge --no-ff xxx
- git stash
- git remote
- git pull
- git checkout -b branchName origin/branchName
- git log --graph --pretty=oneline --abbrev-commit
- git rebase
- git tag name
- .gitignore
- 設置別名
本人以後的博客轉移到個人小站: https://www.kurby.top/ 本小站作爲個人的生活、編程、胡思亂想等記錄站點,歡迎大家來訪問。
Git的誕生
先是因爲CVS、SVN都是付費的,不符合開源精神,後來 BitKeeper 的東家BitMover公司出於人道主義精神,授權Linux社區免費使用這個版本控制系統。 後來有個Linux的牛人把BitMove給破解了,所以LinuX無法免費使用了,Linus大佬用了兩週時間用C寫出了一個分佈式的版本控制系統Git,此乃神人也~
Git的安裝
Git下載,可以自己根據自己的操作系統選擇,我爲了方便用的是windows的,
安裝完成後,運行git bash ,彈出一個命令行的東西,說明安裝成功了。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
創建版本庫
創建一個文件夾、git init 把當前目錄設置成Git可以管理的倉庫:
$ mkdir learngit
$ cd learngit
$ git init
如果你沒有看到.git
目錄,那是因爲這個目錄默認是隱藏的,用ls -ah
命令就可以看見。
上傳文件放到Git倉庫
git add && git commit
第 一步,用命令git add
告訴Git,把文件添加到倉庫:
$ git add readme.txt
第二步,用命令git commit
告訴Git,把文件提交到倉庫:
簡單解釋一下git commit
命令,-m
後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。
爲什麼Git添加文件需要add
,commit
一共兩步呢?因爲commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
我們已經成功地添加並提交了一個readme.txt文件,現在,是時候繼續工作了,於是,我們繼續修改readme.txt文件,改成如下內容:
Git is a distributed version control system.
Git is free software.
git status
現在,運行git status
命令看看結果:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令輸出告訴我們,readme.txt
被修改過了,但還沒有準備提交的修改。
git diff
雖然Git告訴我們readme.txt
被修改了,但如果能看看具體修改了什麼內容,自然是很好的。比如你休假兩週從國外回來,第一天上班時,已經記不清上次怎麼修改的readme.txt
,所以,需要用git diff
這個命令看看:
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git diff
顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式,可以從上面的命令輸出看到,我們在第一行添加了一個distributed
單詞。
知道了對readme.txt
作了什麼修改後,再把它提交到倉庫就放心多了,提交修改和提交新文件是一樣的兩步,第一步是git add
:
$ git add readme.txt
同樣沒有任何輸出。在執行第二步git commit
之前,我們再運行git status
看看當前倉庫的狀態:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: readme.txt
git status
告訴我們,將要被提交的修改包括readme.txt
,下一步,就可以放心地提交了:
$ git commit -m "add distributed"
[master e475afc] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)
提交後,我們再用git status
命令看看倉庫的當前狀態:
$ git status
On branch master
nothing to commit, working tree clean
git log
查看版本控制的記錄
git log --pretty=oneline 就查看一行有那些版本
上圖中的(HEAD ->master)表示的就是當前使用的版本
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD
表示當前版本,也就是最新的提交1094adb...
(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。
想要回到add something 要用
git reset --hard HEAD^ 表示要回到上一個版本
圖中可以看到版本變成了 add something 的版本了
但是要注意的是咱們執行git log 只有2個版本了,add lpl的版本不見了!咋辦很慌啊?
git reflog
可以記錄咱們的git reset 的所有操作 ,我們只有git reset --hard xxx 就行了。
git checkout –
撤銷更改的文件。 注意: 這裏和git checkout 不一樣 有 –
可以撤銷已經git add file和git checkout – file的文件回到之前的狀態
注意: 還可以用 git reset HEAD readme.txt 功能和git checkout – 一樣的。
git rm xxx
添加了一個文件到版本庫之後,如果這個文件刪除了,那麼git status的時候就會顯示這個文件已經刪除了,如果不要這個文件了,可以 git rm xxx 從本地版本庫中刪除xxx文件。
https://www.liaoxuefeng.com/wiki/896043488029600/900002180232448 學到
遠程倉庫
添加遠程倉庫
自己在github上創建一個倉庫
現在,我們根據GitHub的提示,在本地的learngit
倉庫下運行命令:
$ git remote add origin michaelliao/learngit.git
請千萬注意,把上面的michaelliao
替換成你自己的GitHub賬戶名,否則,你在本地關聯的就是我的遠程庫,關聯沒有問題,但是你以後推送是推不上去的,因爲你的SSH Key公鑰不在我的賬戶列表中。
添加後,遠程庫的名字就是origin
,這是Git默認的叫法,也可以改成別的,但是origin
這個名字一看就知道是遠程庫。
下一步,就可以把本地庫的所有內容推送到遠程庫上:
$ git push -u origin master
問題:
1、git有時候會報這樣的問題
ERROR: Repository not found.fatal: Could not read from remote repository. Please make sure you have the correct access rightsand the repository exists.
解決方案是
git remote set-url命令修改remote URL
git remote set-url傳遞兩個參數
- remote name。例如,origin或者upstream
- new remote url。例如,[email protected]:USERNAME/OTHERREPOSITORY.git
git remote set-url origin [email protected]:xxxxxx/xxxxxx.git
查看是否成功
$ git remote -v origin
https:YourUserName/YatouTest00123.git (fetch)origin https:YourUserName/YatouTest00123.git (push)
2、 可能是本地命令行 ping github.com ping不同 ,是DNS的問題,可以從別人的電腦複製一個過來
https://blog.csdn.net/jackli_git/article/details/72861546
另外:重新定義origin的路徑
$ git remote set-url origin [email protected]:Kurby96/test.git
從遠程倉庫克隆到本地
$ git clone [email protected]:michaelliao/gitskills.git
注意把Git庫的地址換成你自己的,然後進入gitskills
目錄看看,已經有README.md
文件了:
$ cd gitskills
$ ls
README.md
分支管理
git checkout -b xxx 或 git switch -c xxx
創建新的分支,然後切換到新分支
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
參數表示創建並切換,相當於以下兩條命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
git branch xxx
創建xxx分支
git branch -d XXX
刪除xxx分支
git branch
這個後面沒有參數的就是查看當前所有的分支有什麼, git branch
命令會列出所有分支,當前分支前面會標一個*
號。
git branch -d和git branch -D xxx
git checkout xxx 或 git switch xxx
切換到xxx分支
git merge
合併分支,這種是快進模式合併,速度快,並不是每次都能快速合併。
eg:先切換到master分支(也可以是其他分支)去,然後合併你想要合併的分支。
$ git checkout master
$ git merge dev
git log --graph
命令可以看到分支合併圖。
git merge --no-ff xxx
不用Fast forward
模式進行合併分支。
上圖的這種合併,就是--no-ff
這種合併方式,一個項目從黑色字的master分支,迭代了2個版本到黑色head處,現在想要把黑色的head合併到master,而且還有保存黑字master的版本,就要用--no-ff
這種合併方式。
git stash
我們更改了數據之後,如果想切換到另一個分支,就需要git add xx,然後git commit -m “xxxx”,先存一下,才能切換。
如果我們不想這麼操作,可以用git stash,它會存到一個stash鏈表裏,
$ git stash list ----查看當前存儲的東西
$ git stash apply ---恢復stash內容不刪除
$ git stash drop ----刪除
$ git stash pop -----恢復的同時,內容也清除
$ git stash apply stash@{0} -----恢復指定的stash 括號內是list的順序
git remote
查看遠程分支的名稱
git remote -v ---------查看遠程倉庫的信息
git pull
如果其他人在git push origin xxx ,而且此時你也在git push origin xxx,就會出錯,因爲遠程的內容比你的新,這時你就可以用,git pull把最新的提交從origin/dev抓下來,然後本地合併,解決問題,再推送。
git pull
也失敗了,原因是沒有指定本地dev
分支與遠程origin/dev
分支的鏈接,根據提示,設置dev
和origin/dev
的鏈接:
$ git branch --set-upstream-to=origin/dev dev
再git pull,如果合併之後,可能會有問題,手動解決,然後再push。
git checkout -b branchName origin/branchName
在本地創建與遠程一樣的分支,
git checkout -b branchName則是在本地當前分支基礎上創建分支。
git log --graph --pretty=oneline --abbrev-commit
查看分支結構。
git rebase
重新使git log --graph --pretty=oneline --abbrev-commit得到的分支變成一條直線。
git tag name
創建一個標籤
git tag <name> <commit id> -----打標籤
git tag -a -m "blablabla..." -----可以指定標籤信息
git tag ----查看標籤信息
git tag -d v0.1 ----刪除標籤
git push origin <tagname> -----推送標籤到遠程
git push origin --tags ------推送本地所有標籤到遠程
如果標籤已經推送到遠程,要刪除,需要從本地和遠程分別刪除
git tag -d v0.1 --本地刪除
git push origin :refs/tags/v0.1 --遠程刪除
.gitignore
忽略git的文件
如果文件被忽略了,可以使用git add -f xxx ,強制添加到git
git check-ignore -v xxx -----查看忽略的文件的規則
設置別名
$ git config --global alias.st status ----其中st 是status的別名
h origin -----推送標籤到遠程
git push origin --tags ------推送本地所有標籤到遠程
如果標籤已經推送到遠程,要刪除,需要從本地和遠程分別刪除
git tag -d v0.1 --本地刪除
git push origin :refs/tags/v0.1 --遠程刪除
#### .gitignore
忽略git的文件
如果文件被忽略了,可以使用git add -f xxx ,強制添加到git
git check-ignore -v xxx -----查看忽略的文件的規則
### 設置別名
```sh
$ git config --global alias.st status ----其中st 是status的別名
本博客參考廖雪峯git教程:廖老師網站官網,非常感謝廖老師的分享。