Git從入門實戰

      網友投稿 782 2025-03-31

      什么是 Github?


      github是一個基于git的代碼托管平臺,付費用戶可以建私人倉庫,我們一般的免費用戶只能使用公共倉庫,也就是代碼要公開。

      Github 由Chris Wanstrath, PJ Hyett 與Tom Preston-Werner三位開發者在2008年4月創辦。迄今擁有59名全職員工,主要提供基于git的版本托管服務。

      基本概念

      我們先來理解下 Git 工作區、暫存區和版本庫概念:

      工作區:就是你在電腦里能看到的目錄。

      暫存區:英文叫 stage 或 index。一般存放在?.git?目錄下的 index 文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。

      版本庫:工作區有一個隱藏目錄?.git,這個不算工作區,而是 Git 的版本庫。

      下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關系:

      圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage/index),標記為 "master" 的是 master 分支所代表的目錄樹。

      圖中我們可以看出此時 "HEAD" 實際是指向 master 分支的一個"游標"。所以圖示的命令中出現 HEAD 的地方可以用 master 來替換。

      圖中的 objects 標識的區域為 Git 的對象庫,實際位于 ".git/objects" 目錄下,里面包含了創建的各種對象及內容。

      當對工作區修改(或新增)的文件執行?git add?命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。

      當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。

      當執行?git reset HEAD?命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

      當執行?git rm --cached ?命令時,會直接從暫存區刪除文件,工作區則不做出改變。

      當執行?git checkout .?或者?git checkout -- ?命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。

      當執行?git checkout HEAD .?或者?git checkout HEAD ?命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

      Git 與 SVN 區別

      Git 不僅僅是個版本控制系統,它也是個內容管理系統(CMS),工作管理系統等。

      如果你是一個具有使用 SVN 背景的人,你需要做一定的思想轉換,來適應 Git 提供的一些概念和特征。

      Git 與 SVN 區別點:

      1、Git 是分布式的,SVN 不是:這是 Git 和其它非分布式的版本控制系統,例如 SVN,CVS 等,最核心的區別。

      2、Git 把內容按元數據方式存儲,而 SVN 是按文件:所有的資源控制系統都是把文件的元信息隱藏在一個類似 .svn、.cvs 等的文件夾里。

      3、Git 分支和 SVN 的分支不同:分支在 SVN 中一點都不特別,其實它就是版本庫中的另外一個目錄。

      4、Git 沒有一個全局的版本號,而 SVN 有:目前為止這是跟 SVN 相比 Git 缺少的最大的一個特征。

      5、Git 的內容完整性要優于 SVN:Git 的內容存儲使用的是 SHA-1 哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時降低對版本庫的破壞。

      配置Git

      首先在本地創建ssh key;

      $ ssh-keygen -t rsa -C "your_email@youremail.com"

      后面的your_email@youremail.com改為你在github上注冊的郵箱,之后會要求確認路徑和輸入密碼,我們這使用默認的一路回車就行。成功的話會在~/下生成.ssh文件夾,進去,打開id_rsa.pub,復制里面的key。

      回到github上,進入 Account Settings(賬戶配置),左邊選擇SSH Keys,Add SSH Key,title隨便填,粘貼在你電腦上生成的key。

      為了驗證是否成功,在git bash下輸入:

      $ ssh -T git@github.com

      如果是第一次的會提示是否continue,輸入yes就會看到:You've successfully authenticated, but GitHub does not provide shell access 。這就表示已成功連上github。

      接下來我們要做的就是把本地倉庫傳到github上去,在此之前還需要設置username和email,因為github每次commit都會記錄他們。

      $ git config --global user.name "your name" $ git config --global user.email "your_email@youremail.com"

      進入要上傳的倉庫,右鍵git bash,添加遠程地址:

      $ git remote add origin git@github.com:yourName/yourRepo.git

      后面的yourName和yourRepo表示你再github的用戶名和剛才新建的倉庫,加完之后進入.git,打開config,這里會多出一個remote "origin"內容,這就是剛才添加的遠程地址,也可以直接修改config來配置遠程地址。

      創建新文件夾,打開,然后執行?git init?以創建新的 git 倉庫。

      檢出倉庫

      執行如下命令以創建一個本地倉庫的克隆版本:

      git clone /path/to/repository

      如果是遠端服務器上的倉庫,你的命令會是這個樣子:

      git clone username@host:/path/to/repository

      工作流

      你的本地倉庫由 git 維護的三棵"樹"組成。第一個是你的?工作目錄,它持有實際文件;第二個是?暫存區(Index),它像個緩存區域,臨時保存你的改動;最后是?HEAD,它指向你最后一次提交的結果。

      你可以提出更改(把它們添加到暫存區),使用如下命令:

      git add

      git add *

      這是 git 基本工作流程的第一步;使用如下命令以實際提交改動:

      git commit -m "代碼提交信息"

      現在,你的改動已經提交到了?HEAD,但是還沒到你的遠端倉庫。

      推送改動

      你的改動現在已經在本地倉庫的?HEAD?中了。執行如下命令以將這些改動提交到遠端倉庫:

      git push origin master

      可以把?master?換成你想要推送的任何分支。

      如果你還沒有克隆現有倉庫,并欲將你的倉庫連接到某個遠程服務器,你可以使用如下命令添加:

      git remote add origin

      如此你就能夠將你的改動推送到所添加的服務器上去了。

      分支

      分支是用來將特性開發絕緣開來的。在你創建倉庫的時候,master?是"默認的"分支。在其他分支上進行開發,完成后再將它們合并到主分支上。

      創建一個叫做"feature_x"的分支,并切換過去:

      git checkout -b feature_x

      切換回主分支:

      git checkout master

      再把新建的分支刪掉:

      git branch -d feature_x

      除非你將分支推送到遠端倉庫,不然該分支就是?不為他人所見的:

      git push origin

      更新與合并

      要更新你的本地倉庫至最新改動,執行:

      git pull

      以在你的工作目錄中?獲取(fetch)?并?合并(merge)?遠端的改動。

      要合并其他分支到你的當前分支(例如 master),執行:

      git merge

      在這兩種情況下,git 都會嘗試去自動合并改動。遺憾的是,這可能并非每次都成功,并可能出現沖突(conflicts)。 這時候就需要你修改這些文件來手動合并這些沖突(conflicts)。改完之后,你需要執行如下命令以將它們標記為合并成功:

      git add

      在合并改動之前,你可以使用如下命令預覽差異:

      git diff

      標簽

      為軟件發布創建標簽是推薦的。這個概念早已存在,在 SVN 中也有。你可以執行如下命令創建一個叫做?1.0.0?的標簽:

      git tag 1.0.0 1b2e1d63ff

      1b2e1d63ff?是你想要標記的提交 ID 的前 10 位字符。可以使用下列命令獲取提交 ID:

      git log

      你也可以使用少一點的提交 ID 前幾位,只要它的指向具有唯一性。

      替換本地改動

      假如你操作失誤(當然,這最好永遠不要發生),你可以使用如下命令替換掉本地改動:

      git checkout --

      此命令會使用 HEAD 中的最新內容替換掉你的工作目錄中的文件。已添加到暫存區的改動以及新文件都不會受到影響。

      假如你想丟棄你在本地的所有改動與提交,可以到服務器上獲取最新的版本歷史,并將你本地主分支指向它:

      git fetch origin

      git reset --hard origin/master

      實用小貼士

      內建的圖形化 git:

      gitk

      彩色的 git 輸出:

      git config color.ui true

      顯示歷史記錄時,每個提交的信息只顯示一行:

      git config format.pretty oneline

      交互式添加文件到暫存區:

      git add -i

      Git常用命令總結:

      git help git ? ? ? ? ? ? ? ?#查看git命令幫助

      git config --help ? ? ? ? ? ? #查看config幫助

      git config --global user.name 'wsyht' ? ? ? ? ? #設置用戶名標識

      git config --global user.email t89191958201@139.com ?#設置郵箱標識

      git config --list ? ? ? ? ? ?#查看配置內容

      git init ? ? ? ? ? ? ? ? ?#創建版本庫

      git add 文件名 ? ? ? ? ? ? ?#添加到暫存區

      git commit -m'你描述的內容' ?#提交

      git status ?? ? ? ? #查看狀態

      git diff ?文件名?? ? #查看文件比較

      git log?? ? ? ? ? ?#查看提交的歷史記錄

      git log --graph --pretty=oneline --abbrev-commit ? ? #--graph以圖形化顯示,--pretty=oneline省略部分信息輸出,--abbrev-commit則是縮短版本號簡短顯示

      git reset --hard HEAD^ ? ? ? #git reset --hard HEAD^

      git reset --hard HEAD^^ ? ? ?#git reset --hard HEAD^^

      git reset --hard HEAD~100 ? ? #回退到前100個版本

      git reflog? ? ? ? ? ? ? #獲取版本號

      git reset --hard 版本號 ? ? ?#恢復版本

      git checkout -- 文件名 ? ? ? #撤銷工作區的修改

      git checkout .? ? ? ? ? ? #撤銷工作區的修改

      git reset HEAD 文件名? ? ? ?#轍消暫存區的修改

      git remote add origin git@github.com:wsyht/demo_test.git ? #添加遠程url連接

      git push -u origin master ? ?#第一次push需要加-u

      git remote rm origin ? ? ? #刪除遠程默認倉庫名"origin

      Git從入門到實戰

      git branch?? ? #查看分支

      git branch 分支名字 ? ? ? ? ?#創建分支

      git checkout 分支名字 ? ? ? ? #切換分支

      git checkout -b 分支名字 ? ? ? #創建切換分支

      git merge 分支名字 ? ? ? ? ? #合并某分支到當前分支

      git branch -d 分支名字 ? ? ? ?#刪除分支

      git branch -D wsyht ? ? ? ? ?#大D強制刪除

      git stash? ? ? ? ?#儲藏當前修改狀態

      git stash list ??? ?#查看儲藏內容

      git stash pop ? ? ? #恢復原來修改的狀態

      git remote -v ? ? ? #查看遠程庫的詳信息

      git pull?? ? ? ? ? ? ?#更新本地工作區

      git fetch origin ? ? ? ? #取所有遠程庫的分支到本地

      git fetch origin 分支名 ? ?#取某個分支

      git branch 分支名 origin/分支名 ? ? ? ? ? ? ?#創建遠程庫的分支到本地

      git clone git@github.com:github注冊名/項目名.git ? #克隆GitHub項目到本地

      git clone git@server ip:/倉庫路徑/倉庫目錄名字 ? ?#克隆Git服務器項目到本地

      git check-ignore -v xx.xx ? ???#查看要添加的那個文件在.gitignore的哪一行設置了忽略

      git add -f 文件名 ? ? ? ? ? ?#強制添加此文件到暫存區

      it tag v1.0 ??? ? ?? ? ? ?#創建標簽v1.0

      git tag v1.1 805dcba ? ? ? ? ?#通過指定他的號碼來給他創建標簽

      git tag -a v0.4 -m "我的第三個標簽" e4ace0b ? ?#-a 指定標簽號,-m 指定描述的內容

      git tag ? ? ? ? ? ? ? ? ? ? ??? ? ?#查看所有標簽

      git tag -d v0.3? ? ? ? ? ? #刪除標簽

      git push origin v0.4 ?? ? ? ?#提交單個標簽

      git push origin ?--tags ? ? ? #提交所有標簽

      git tag -d v0.4? ? ? ? ? ? ?#刪除遠程標簽第一步

      git push origin :refs/tags/v0.4??#刪除遠程標簽第二步

      git config --global alias.st status ? #把status 配置成別名 st,其他命令設別名依此類推

      git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" ?#日志別名配置

      推薦閱讀: 萬子長文肝git

      Git GitHub

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:excel隱藏快捷鍵是什么(excel表格中隱藏快捷鍵是什么)
      下一篇:5個跡象表明您的企業急需ERP系統
      相關文章
      国产a v无码专区亚洲av| 日韩亚洲变态另类中文| 亚洲伦理一二三四| 亚洲天堂在线播放| 亚洲成人高清在线| 亚洲午夜精品一级在线播放放| 亚洲乱码一二三四区国产| 亚洲GV天堂无码男同在线观看 | 亚洲国产成人久久精品大牛影视| 亚洲国产成人五月综合网| 亚洲 国产 图片| 亚洲AV无码专区在线观看成人 | 亚洲处破女AV日韩精品| 91嫩草亚洲精品| 亚洲AV日韩综合一区| 亚洲综合一区二区精品导航| 亚洲性在线看高清h片| jzzijzzij在线观看亚洲熟妇| 国产精品高清视亚洲一区二区| 亚洲综合久久久久久中文字幕| 中文字幕一精品亚洲无线一区| 国产成人综合亚洲一区| 亚洲精品无码av片| 亚洲乱码一区二区三区国产精品| 亚洲国产精品第一区二区| 亚洲色一色噜一噜噜噜| 亚洲精品国产综合久久一线| 偷自拍亚洲视频在线观看99| 久久综合久久综合亚洲| 亚洲综合欧美色五月俺也去| 波多野结衣亚洲一级| 亚洲人成黄网在线观看| 亚洲一区免费在线观看| 精品日韩亚洲AV无码| 亚洲av福利无码无一区二区| 亚洲乱色熟女一区二区三区丝袜 | 亚洲精品无码精品mV在线观看| 亚洲一区日韩高清中文字幕亚洲| 国产精品亚洲专一区二区三区| 亚洲精品人成网线在线播放va | 亚洲人成免费电影|