本文是向大家介紹git的基礎(chǔ)操作、相關(guān)配置以及與idea的整合使用,希望能給開發(fā)同學(xué)帶來更好的開發(fā)體驗(yàn)和提升開發(fā)效率,讓你的開發(fā)得心應(yīng)手。
一、git是什么
Git 是一個(gè)開源的分布式版本控制軟件,用以有效、高速的處理從很小到非常大的項(xiàng)目版本管理。 Git 最初是由Linus Torvalds設(shè)計(jì)開發(fā)的,用于管理Linux內(nèi)核開發(fā)。Git 是根據(jù)GNU通用公共許可證版本2的條款分發(fā)的自由/免費(fèi)軟件,安裝參見:http://git-scm.com/
GitHub是一個(gè)基于Git的遠(yuǎn)程文件托管平臺(tái)(同GitCafe、BitBucket和GitLab等)。
Git本身完全可以做到版本控制,但其所有內(nèi)容以及版本記錄只能保存在本機(jī),如果想要將文件內(nèi)容以及版本記錄同時(shí)保存在遠(yuǎn)程,則需要結(jié)合GitHub來使用。使用場景:
無GitHub:在本地 .git 文件夾內(nèi)維護(hù)歷時(shí)文件
有GitHub:在本地 .git 文件夾內(nèi)維護(hù)歷時(shí)文件,同時(shí)也將歷時(shí)文件托管在遠(yuǎn)程倉庫
二、git的三個(gè)區(qū)

工作區(qū)(working Directory):簡單的理解你在電腦里能看到的目錄。
暫存區(qū)(stage):Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master,以及指向master的一個(gè)指針叫HEAD。
版本庫(Repository):工作區(qū)有一個(gè)隱藏目錄.git,這個(gè)不算工作區(qū),而是Git的版本庫。
要完成一次完整的提交,我們需要git add->git commit才可以,就像我們?nèi)ベ徫镆粯樱劝褨|西放到購物車,在去結(jié)賬是一樣的。
三、git常用指令及idea的git操作
git add 命令
可將該文件添加到暫存區(qū)
添加一個(gè)或多個(gè)文件到暫存區(qū):
git add [file1] [file2] ...
添加指定目錄到暫存區(qū),包括子目錄:
git add [dir]
添加當(dāng)前目錄下的所有文件到暫存區(qū):
git add .
對(duì)應(yīng)idea操作

推薦使用快捷鍵 ctrl + alt + A
git commit 指令
git commit -m [message] 提交本次修改到本地
git log 找到提交記錄,找到要還原的commit的上一個(gè)commit_id
git reset commit_id :將會(huì)把commit 還原到commit_id這一步
git reset --hard commit_id : 將會(huì)把commit還原到commit_id這一步,同時(shí)會(huì)把要還原的commit的本地修改還原,謹(jǐn)慎使用這個(gè)

idea推薦使用快捷鍵 ctrl + k
pull、push指令
git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
更新操作:
$ git pull
$ git pull origin
git push <遠(yuǎn)程主機(jī)名> <本地分支名>:<遠(yuǎn)程分支名>
以下命令將本地的 master 分支推送到 origin 主機(jī)的 master 分支。
$ git push origin master
相等于:
$ git push origin master:master
如果本地版本與遠(yuǎn)程版本有差異,但又要強(qiáng)制推送可以使用 --force 參數(shù):
git push --force origin master

idea中推薦使用快捷鍵
ctrl + t? ? 拉取遠(yuǎn)程更新
ctrl + shift + k? 推送到遠(yuǎn)程
git新建分支?
? git checkout -b iss53 新建一個(gè)分支并同時(shí)切換到分支上
? Switched to a new branch "iss53"
? 把本地分支推送到服務(wù)器上
? $ git push origin iss53
idea快捷鍵 ctrl + shift + ~? 按出彈窗后 可以新建分支 和 checkout 切換分支
git暫存
? git stash
? git stash apply
? git stash save '消息';修改暫存到本地,本地恢復(fù)
? git stash pop 將暫存覆蓋過來

git合并分支
? 切換到想要合并的分支
? git checkout
? 合并分支
? git merge

刪除分支
? git branch -d? XX
? git branch -D? xx? 強(qiáng)制刪除

更改分支名稱
git branch -m old_branch new_branch
// Rename branch locally
git push origin :old_branch
// Delete the old branch? 注意這里冒號(hào)前有一個(gè)空格
tag(標(biāo)簽)管理
git也可以在某個(gè)時(shí)間點(diǎn)打上一個(gè)版本標(biāo)簽,例如在某個(gè)時(shí)間打一個(gè)版本,方便標(biāo)識(shí)。
git tag? 查看tag(標(biāo)簽)列表


git? tag? -d? v1.1? ? 刪除v1.1tag
git? tag? v1.0? ? ? 添加本地標(biāo)簽v1.0
git? tag? -a? tag_name? -m? ? '注釋'? ? ? 添加本地標(biāo)簽同時(shí)加上注釋。
此時(shí)tag標(biāo)簽都只是在本地庫里,還未提交到遠(yuǎn)程倉庫。
git? push? origin? v1.0? 將 tag v1.0 提交到遠(yuǎn)程倉庫

刪除遠(yuǎn)端倉庫的tag
git? push? origin? :refs/tags/tag_name

根據(jù)tag創(chuàng)建分支
現(xiàn)在主分支上有一個(gè)tag為v1.0.0,主分支的名字為master.
1.執(zhí)行:git origin fetch 獲得更新
2.根據(jù)tag創(chuàng)建新的分支
git branch <new-branch-name> <tag-name>
例如:
git branch newbranch? tag_v1.0.0
會(huì)以tag_v1.0.0的倉庫,創(chuàng)建新的分支newbranch;
3.再通過
git checkout newbranch
切換到新的分支.
分支比對(duì)
推薦使用idea對(duì)比

選擇上需要對(duì)比的分支或者版本
四、git配置多個(gè)代碼平臺(tái)
需求:有時(shí)候我們的代碼托管在多個(gè)平臺(tái)上,這就需要為每個(gè)托管平臺(tái)設(shè)置SSH-key
1.生成一個(gè)gitee用的SSH-Key
$ ssh-keygen -t rsa -C "1393081219@qq.com" -f ~/.ssh/gitee_rsa? ? ? ? ? ? ? ? ?
2.生成一個(gè)github用的SSH-Key
$ ssh-keygen -t rsa -C "1393081219@qq.com" -f ~/.ssh/github_rsa
在相應(yīng)的遠(yuǎn)端添加公匙

如果執(zhí)行ssh-add時(shí)提示”Could not open a connection to your authentication agent”

可以先執(zhí)行命令:
$ ssh-agent bash
然后再重新運(yùn)行ssh-add命令:
$ ssh-add ~/.ssh/id_rsa
$ ssh-add ~/.ssh/github_rsa
添加后我們可以通過 ssh-add -l 來確私鑰列表
$ ssh-add -l
如果想刪除私鑰列表,可以通過 ssh-add -D 來清空私鑰列表
$ ssh-add -D
若.ssh目錄(就是私鑰所在的文件夾)下無config文件,那么創(chuàng)建
touch config
在config文件添加以下內(nèi)容
# gitlab
Host github.com
Port 22
HostName github.com
PreferredAuthentications publickey
IdentityFile C:/Users/xiaohaozi/.ssh/github-rsa
User xiaohaozi
# smartgit
Host smartgit
HostName smartgit
PreferredAuthentications publickey
IdentityFile C:/Users/xiaohaozi/.ssh/id_rsa
User xiaohaozi
# 配置文件參數(shù)
# Host : Host可以看作是一個(gè)你要識(shí)別的模式,對(duì)識(shí)別的模式,進(jìn)行配置對(duì)應(yīng)的的主機(jī)名和ssh文件(可以直接填寫ip地址)
# HostName : 要登錄主機(jī)的主機(jī)名(建議與Host一致)
# User : 登錄名(如gitlab的username)
# IdentityFile : 指明上面User對(duì)應(yīng)的identityFile路徑
# Port: 端口號(hào)(如果不是默認(rèn)22號(hào)端口則需要指定)
在.ssh目錄創(chuàng)建config文本文件并完成相關(guān)配置(最核心的地方)
每個(gè)賬號(hào)單獨(dú)配置一個(gè)Host,每個(gè)Host要取一個(gè)別名,每個(gè)Host主要配置HostName和IdentityFile兩個(gè)屬性即可
Host的名字可以取為自己喜歡的名字,不過這個(gè)會(huì)影響git相關(guān)命令,例如:Host mygithub 這樣定義的話,命令如下,即git@后面緊跟的名字改為mygithub
例如:git clone git@mygithub:PopFisher/AndroidRotateAnim.git
HostName 這個(gè)是真實(shí)的域名地址
IdentityFile 這里是id_rsa的地址
PreferredAuthentications? 配置登錄時(shí)用什么權(quán)限認(rèn)證--可設(shè)為publickey,password publickey,keyboard-interactive等
User 配置使用用戶名
測(cè)試
$ ssh -T git@github.com
輸出
Welcome to GitLab, your name!
則說明成功了。