git與github區別與簡介及常用命令詳解

文章目錄

1,常見版本管理工具介紹 及 版本工具作用

1. 爲什麼要使用版本控制

1)假設你在的公司要上線一個新功能,你們開發團隊爲實現這個新功能,寫了大約5000行代碼,上線沒2天,就發現這個功能用戶並不喜歡,你老闆讓你去掉這個功能,你怎麼辦?
2)你說簡單,直接把5000行代碼去掉就行了,但是我的親,說的簡單,你的這個功能寫了3周時間,但你還能記得你是新增加了哪5000行代碼麼?
3)所以你急需要一個工具,能幫你記錄每次對代碼做了哪些修改,並且可以輕易的把代碼回滾到歷史上的某個狀態。 這個神奇的工具就叫做版本控制

2. 版本控制工具主要實現2個功能

1)版本管理
在開發中,這是剛需,必須允許可以很容易對產品的版本進行任意回滾,版本控制工具實現這個功能的原理簡單來講,就是你每修改一次代碼,它就幫你做一次快照

2)協作開發
   a. 一個複雜點的軟件,往往不是一個開發人員可以搞定的,公司爲加快產品開發速度,會招聘一堆跟你一樣的開發人員開發這個產品
   b. 拿微信來舉例,現在假設3個人一起開發微信,A開發聯繫人功能,B開發發文字、圖片、語音通訊功能,C開發視頻通話功能, B和C的功能都是要基於通訊錄的
   c. 你說簡單,直接把A開發的代碼copy過來,在它的基礎上開發就好了,可以,但是你在他的代碼基礎上開發了2周後,這期間A沒閒着,對通訊錄代碼作了更新,此時怎麼辦?你和他的代碼不一致
   d. 此時我們知道,你肯定要再把A的新代碼拿過來替換掉你手上的舊通訊錄功能代碼, 現在人少,3個人之間溝通很簡單,但想想,如果團隊變成30個人呢?
   e. 來回這樣copy代碼,很快就亂了, 所以此時亟需一個工具,能確保一直存儲最新的代碼庫,所有人的代碼應該和最新的代碼庫保持一致

3. 常見版本管理工具介紹

  • 3.1、SVN --CollabNet Subversion
  1. SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而幹活的時候,用的都是自己的電腦,
  2. 所以首先要從中央服務器哪裏得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央服務器。
  3. 集中式版本控制系統是必須聯網才能工作,如果在局域網還可以,帶寬夠大,速度夠快,如果在互聯網下,如果網速慢的話,就納悶了。

3.2、Git

  1. Git是分佈式版本控制系統,那麼它就沒有中央服務器的,每個人的電腦就是一個完整的版本庫,
  2. 這樣,工作的時候就不需要聯網了,因爲版本都是在自己的電腦上。
  3. 你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了,當然也可以推送到git的倉庫中,比如GitHub

2,git、GitHub和SVN比較

1. Git

1、git是一個版本管理工具,是可以在你電腦不聯網的情況下,只在本地使用的一個版本管理工具
2、其作用就是可以讓你更好的管理你的程序,比如你原來提交過的內容,以後雖然修改了,但是通過git這個工具,可以把你原來提交的內容重現出來

2. GitHub

1、github是一個網站,就是每個程序員自己寫的程序,可以在github上建立一個網上的倉庫,
2、你每次提交的時候可以把代碼提交到網上,,這樣你的每次提交,別人也都可以看到你的代碼,同時別人也可以幫你修改你的代碼,這種開源的方式非常方便程序員之間的交流和學習
3、github是一個非常適合程序員交流的網站,很多國際上的技術大牛都在github上有自己的開源代碼,其他人只要申請個賬號就可以隨意的看到這些大牛寫的程序
   總結: git可以認爲是一個軟件,能夠幫你更好的寫程序,github則是一個網站,這個網站可以幫助程序員之間互相交流和學習。

3. SVN與git比較

1、Git是分佈式的,SVN是集中式的,好處是跟其他同事不會有太多的衝突,自己寫的代碼放在自己電腦上,一段時間後再提交、合併,也可以不用聯網在本地提交
2、Git下載下來後,在本地不必聯網就可以看到所有的log,很方便學習,SVN卻需要聯網;
3、Git鼓勵分Branch,而SVN,說實話,我用Branch的次數還挺少的,SVN自帶的Branch merge我還真沒用過
4、SVN在Commit前,我們都建議是先Update一下,跟本地的代碼編譯沒問題,並確保開發的功能正常後再提交,這樣其實挺麻煩的,有好幾次同事沒有先Updat,Commit了,發生了一些錯誤,Git可能這種情況

3,本地git基本使用命令

1. 創建git版本庫

1、版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,
2、這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。
3、所以,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目
4、瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository)
5、細心的讀者可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,不然改亂了,就把Git倉庫給破壞了。

  mkdir s15_gitpro                 #先創建一個項目
  cd s15_gitpro/                   #切換到這個項目目錄
  git init                         #初始化這個

2. 工作區、暫存區、代碼倉庫

1、工作區: 就是你在電腦上看到的目錄,比如目錄下testgit裏的文件(.git隱藏目錄版本庫除外)。
2、暫存區 : 暫存區就是文件夾 .git中的一個小部分(.git文件夾就是版本庫)
3、版本庫:工作區有一個隱藏目錄.git,這個不屬於工作區,這是版本庫, 版本庫中還有Git爲我們自動創建了第一個分支master,以及指向master的一個指針HEAD
4、 把文件添加到版本庫分爲以下三步:
    1)vim Readme #工作區(Working Zone) 比如在mkdir s15_gitpro下執行創建文件命令
    2)git add #暫存區(Stage zone)
    3)git commit #代碼倉庫(Repository master) 只有提交到代碼庫才能被git管理

3、本地git基本命令

  • 1、將文件添加到倉庫
 git add Readme                       #指定將Readme文件添加到暫存區
 git add .                                   #將當前目錄中的所有文件全部添加到暫存區
 git status                                 #查看更改了哪些,創建了哪些,哪些沒有添加到倉庫,哪些添加到了倉庫
 git status diff readme              #查看readme文件具體修改了哪些
 git commit -m "commit tag"     # git commit告訴Git,把文件提交到倉庫-m後面輸入的是本次提交的說明(版本名字)

 說明:
   # 執行git commit 命令時必須配置用戶信息
      git config --global user.name "Tom Git"
      git config --global user.email tom@example.com
  • 2、回滾
git log                              #查看所有提交到倉庫的版本記錄:   git log -2
git reflog                           #查看所有操作記錄(狀態的md5值和改變的值)
git reset --hard d9e0ed0            #回到指定版本(d9e0ed0是創建版本的MD5值得前6位或者7位)
git reset --hard HEAD^               #回到上一個版本
注:這樣可以回到第一次提交到倉庫的狀態,但再使用git log看不到其他幾次的md5值了

3、撤銷修改

vim Readme                               #我們在Readme文件中寫了一些錯誤的代碼
git add .                                      #然後又一不小心將文件從工作區提交到了 stage區
git reset HEAD Readme            #將Readme中剛提交到 stage區 的代碼撤回到工作區
git status                                    #查看目前工作區狀態
git checkout -- Readme             #將Readme在工作區錯誤的代碼丟棄

4、刪除操作(兩種方法)

 方法1:這種方法需要執行git add .  

 rm Readme
 git add .
 git commit -m "delete file by git rm"
 git reset --hard HEAD^
 方法2:這種方法可以省去執行git add .

 git rm Readme
 git commit -m "delete file by git rm"
 git reset --hard HEAD^

注: 在沒有git commit前,使用 git checkout – Readme 可以恢復刪除的文件(Readme)

5、強制使用master覆蓋本地代碼

 $ git fetch --all
 $ git reset --hard origin/master
 $ git pull

4,使用git操作GitHub

1、登錄https://github.com 創建一個github項

在這裏插入圖片描述

2、選擇創建一個新項目,還是將本地的項目推到github這個項目裏

在這裏插入圖片描述

3、將本地已有的項目上傳到GitHub中

1)這裏我們選擇使用HTTPS的方法,講本地已有項目提交到GitHub中
2)在本地Git對應的項目下執行這條命令,配置,將以後的內容提交到這個路徑下即:GitHub對應的項目中
      git remote add origin https://github.com/Tom7481079/s15_proj.git #設置代碼提交url路徑
      git remote rm origin # 刪除設置的代碼提交url路徑
3)將本地的項目推到GitHub中(需要輸入GitHub網站的用戶名和密碼)
   git push -u origin master # 將本地代碼push到GitHub中
4)然後刷新頁面即可在網頁中看到我們本地的項目上傳成功了

4、GitHub中文件與本地項目不一致時上傳到GitHub報錯解決方法

方法一:使用強制push的方法,這樣會使遠程修改丟失,一般是不可取的,尤其是多人協作開發的時候。
   git push -u origin master -f

方法二:push前先將遠程repository修改pull下來
    git pull origin master # 先將GitHub中的文件下載到本地
    git push -u origin master # 然後在push到GitHub中
注:執行git pull是如果只有GitHub中修改,會自動合併,如果本地也有修改必須手動合併才能正常git push

方法三:若不想merge遠程和本地修改,可以先創建新的分支:
     git branch [name] # 新建一個分支
     git push -u origin [name] # 提交到分支中

5,配置win10當前用戶對GitHub所有項目有權限(git push不必輸入密碼)

1、使用命令生成公鑰和私鑰(在git命令行中執行)

 ssh-keygen.exe               #生成一對公鑰和私鑰
 C:\Users\tom\.ssh           #這裏是生成的祕鑰地址

2、將公鑰上傳到GitHub中

  • 1, 第一步

在這裏插入圖片描述

  • 2, 第二步
    在這裏插入圖片描述

  • 3, 第三步

    在這裏插入圖片描述

  • 4, 第四步
    在這裏插入圖片描述

3. 更改本地push方式爲ssh

  • 1, 配置完公鑰後還需要將GitHub項目的push方式改成ssh
    在這裏插入圖片描述

  • 2, 更改本地push方式爲ssh

1) vim .git/config
2) 將已有的https的路徑替換成ssh模式,即上面複製的地址
        #url = https://github.com/Tom7481079/s15_proj.git
        url = [email protected]:Tom7481079/s15_proj.git

  • 3、此時再執行品push命令時就不會再讓輸入用戶名和密碼了

git push origin master

6,配置Linux當前用戶對GitHub指定項目有權限(git push不必輸入密碼)

1、在centos系統中創建密鑰對

ssh-keygen                               #給當前用戶創建公鑰私鑰
vim ~/.ssh/id_rsa.pub               #將當前用戶公鑰放到GitHub對應項目中

2、將生成的公鑰放到GitHub指定項目中

  • 1、打開指定項目的settings配置

在這裏插入圖片描述

  • 2、選中這個
    在這裏插入圖片描述

  • 3、點擊: “Add deploy key” 並粘貼密鑰

在這裏插入圖片描述

7,git分支管理(創建&合併分支)

1、分支管理的作用

1、假設你準備開發一個新功能,但是需要兩週才能完成,第一週你寫了50%的代碼,如果立刻提交,由於代碼 還沒寫完,不完整的代碼庫會導致別人不能幹活了
2、如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
3、現在有了分支,你創建了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作
4、而你在自己的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工作
5、 其他版本控制系統如SVN等都有分支管理,但是用過之後你會發現,這些版本控制系統創建和切換分支比蝸牛還慢,簡直讓人無法忍受,結果分支功能成了擺設,大家都不去用
6、 但Git的分支是與衆不同的,無論創建、切換和刪除分支,Git在1秒鐘之內就能完成!無論你的版本庫是1個文件還是1萬個文件

2、分支管理-----創建分支

 git branch                              #查看現有分支
 git checkout -b dev               #創建並切換到分支dev, -b參數指切換dev分支
 git checkout master              #從dev分支切換到master
 git branch -D bug-101           #刪除本地分支bug-101

 此時對項目進行修改
 git add .                                              #提交到舞臺區
 git commit -m "update readme"         #提交到倉庫
 git push origin dev                             #將跟新內容提交到分支dev中而不是master中

3、如何將分支dev中的代碼合併到主分支master中

 git checkout master                           #從dev分支切換到master
 git pull                                                #將master上的項目下載到本地
 git merge dev                                     #在master上執行這條命令,試圖合併master和dev(報錯,master更新了)

 vim Readme                                      #將不一致的地方手動合併
 git add .
 git push origin master                        #手動合併後就可以將dev分支上修改的東西上傳到GitHub的master中了

 git log –graph                                     #查看從什麼地方出現的分支

4、分支取名規範

1、方法1: 使用人名作爲分支名(傳統開發每個人負責一個功能模塊)
2、方法2: 根據功能模塊設置分支名(如: feature-100 hotfix-99)

5、全局dev分支(相當於上生產環境前的測試分支)

1、master是不能再上面開發的(master必須是一個穩定版本)
2、所以會有一個全局dev分支,這樣就有三種,master,dev,和每個人自己的分支
3、只有在全局dev中沒問題後纔會真正pull到master中

8,git stash (bug分支)

1、git stash 使用場景

1、當正在其它分支寫代碼時突然有一個在master上發現一個bug需要立刻修改
2、這時當然你可以將正在修改的內容先提交到自己的分支中再切換到bug分支,但比較麻煩
3、這裏就可以執行git stash 命令可以將現在這個狀態臨時保存起來

2、git stash使用

  • 1、在dev工作區正在寫東西,突然有個bug需要立刻修改
vim Readme              #突然出現了一個bug
git stash                     #將dev中未保存的文件放到一個臨時區(以免帶到了bug分支中)

  • 2、切換到bug-100分支,修復bug,並提交到本地倉庫
git checkout -b bug-100                   #創建並切換到bug-100分支
vim Readme                                    #在bug-100分支中修復bug
git add .                                            #將修改內容保存到bug-100分支的舞臺區
git commit -m 'commit-100-bug'      #提交到倉庫

  • 3、切換到master合併bug-100並提交到GitHub
git checkout master             #切換到master
git merge bug-100               #合併master和bug-100分支
git push origin master          #將修改後的內容推送到GitHub上(即可更新master)

  • 4、再次切換到dev分支,恢復以前的狀態
git checkout dev                 #再次切換到dev分支
git status                            #dev分支的工作區沒有東西
more Readme                    #發現以前在dev工作區正在修改未提交到本地倉庫的東西沒有了
git stash list                       #查看使用git stash 臨時保存的文件
git stash apply                   #恢復上次使用git stash 臨時保存的文件
git status                            #可以看到又回到了,切換到bug-100分支前的修改狀態了

  • 5、git stash的其他操作
git stash drop                        #刪除最久的那個使用git stash 保存的臨時狀態
git stash apply stash@{0}     #指定恢復到那個臨時狀態
git stash pop                         #恢復並刪除上一個臨時狀態

  注1:git stash apply恢復,恢復後,stash內容並不刪除,你需要使用命令git stash drop來刪除
  注2:另一種方式是使用git stash pop,恢復的同時把stash內容也刪除了。

9,多人協作開發

1、第一步:在win10中clone GitHub中的項目並創建dev分支

cd c:/
mkdir win10_pro
cd win10_pro/
git clone https://github.com/Tom7481079/test_github.git
cd test_github/
git checkout -b dev              # 此時到Linux中操作

2、第二步:在Linux中也clone GitHub中的項目,創建dev分支,修改後提交到GitHub master中

mkdir /linux_pro
cd linux_pro/
git clone https://github.com/Tom7481079/test_github.git
cd test_github/
git checkout -b dev

vim readme
git add .
git commit -m 'modify_linux_01'

git checkout master       #從dev分支切換到master
git pull                  #將master上的項目下載到本地
git merge dev             #合併master和dev(GitHub中master未更新,可以成功合併)
git push origin master    #成功push到GitHub中

3、第三步:win10中在別人已經提交代碼後自己提交,解決合併衝突

vim readme
git add .
git commit -m 'modify_win10_01'

git checkout master       #從dev分支切換到master
git pull                  #將master上的項目下載到本地(成功但有衝突)
git merge dev             #合併master和dev(GitHub中master已經更新,自動合併失敗)
git status                # 查看有哪些哪些文件不同導致的合併衝突
git diff readme           # 查看readme具體有哪些不同
vim readme                # 手動合併

git add .
git commit "win10_solved_conflict"
git push origin master    #成功push到GitHub中

# 上面git commit也失敗了,git認爲你有部分代碼沒有做好提交的準備
git commit -a             # 提交全部
git commit /c/win10_pro/test_github/readme -i -m "merge"

10,vim .gitignore (指定那些文件不需要git管理)

1、說明

1) 注: 如果某個文件,目錄已經被上傳到GitHub中了,再添加到.gitignore文件中是沒有作用的。
2) 比如core/test1.py以前沒有將/core寫到.gitignore文件中,但是後來添加了
3) 那麼之後對core/test1.py修改依然會改變,但是如果添加core/test2.py是不會出現在GitHub中的
4) GitHub中有各個語言忽略文件模板網址:https://github.com/github/gitignore

2、python中指定忽略的文件

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
.static_storage/
.media/
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/

11,Git基本常用命令

mkdir:         XX (創建一個空目錄 XX指目錄名)

   pwd:          顯示當前目錄的路徑。

   git init          把當前的目錄變成可以管理的git倉庫,生成隱藏.git文件。

   git add XX       把xx文件添加到暫存區去。

   git commit –m “XX”  提交文件 –m 後面的是註釋。

   git status        查看倉庫狀態

   git diff  XX      查看XX文件修改了那些內容

   git log          查看歷史記錄

   git reset  --hard HEAD^ 或者 git reset  --hard HEAD~ 回退到上一個版本

                        (如果想回退到100個版本,使用git reset –hard HEAD~100 )

   cat XX         查看XX文件內容

   git reflog       查看歷史記錄的版本號id

   git checkout -- XX  把XX文件在工作區的修改全部撤銷。

   git rm XX          刪除XX文件

   git remote add origin https://github.com/tugenhua0707/testgit 關聯一個遠程庫

   git push –u(第一次要用-u 以後不需要) origin master 把當前master分支推送到遠程庫

   git clone https://github.com/tugenhua0707/testgit  從遠程庫中克隆

   git checkout –b dev  創建dev分支 並切換到dev分支上

   git branch  查看當前所有的分支

   git checkout master 切換回master分支

   git merge dev    在當前的分支上合併dev分支

   git branch –d dev 刪除dev分支

   git branch name  創建分支

   git stash 把當前的工作隱藏起來 等以後恢復現場後繼續工作

   git stash list 查看所有被隱藏的文件列表

   git stash apply 恢復被隱藏的文件,但是內容不刪除

   git stash drop 刪除文件

   git stash pop 恢復文件的同時 也刪除文件

   git remote 查看遠程庫的信息

   git remote –v 查看遠程庫的詳細信息

   git push origin master  Git會把master分支推送到遠程庫對應的遠程分支上

12,刪除GitHub中創建的項目

1.打開要刪除的項目

在這裏插入圖片描述

2.點擊對應項目的settings

在這裏插入圖片描述

3. 點擊右側菜單的option(默認就是),拉取到最後點擊刪除按鈕

在這裏插入圖片描述

4.爲了安全執行時會彈窗這個提示框

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章