首頁 開發工具 Git 一起來看看史上最詳細Git使用教學課程

一起來看看史上最詳細Git使用教學課程

Apr 09, 2021 pm 05:33 PM

一起來看看史上最詳細Git使用教學課程

Git是世界上最先進的分散式版本控制系統,複製一個專案的速度非常快

每個開發都可以從master上克隆一個本地版本庫,就算沒有網絡,也可以提交程式碼到本地倉庫、查看log、創建專案分支等等

每個版本庫都可以創建無限個分支,分支是個完整的目錄,且這個目錄擁有完整的實際文件

推薦(免費):git

#一、安裝

網路上搜尋安裝教學課程,這裡就不介紹了

安裝完成後,在開始選單裡找到“Git”->“Git Bash”,彈一個類似命令列視窗的東西,就說明Git安裝成功

接著需要設定一下機器信息,這台機器上的所有Git倉庫都會使用這個配置

$ git config --global user.name "username"
$ git config --global user.email "email@example.com"
登入後複製

二、創建版本庫

1、創建一個空目錄(最好不要包含中文)

$ mkdir mymenu
$ cd mymenu
$ pwd
/Users/hxk/mymenu
登入後複製

pwd指令顯示目前目錄

2、初始化倉庫

git init指令把這個目錄變成git可以管理的倉庫

$ git init
Initialized empty Git repository in /Users/hxk/mymenu/.git/
登入後複製

初始化了一個空的倉庫,目錄下多了.git目錄

系統自動創建了唯一一個master分支

版本控制系統只能追蹤文字檔的改動,且編碼方式是utf -8

三、文件的基本操作

建立一個test.txt文件,內容如下:

Hello World
登入後複製

1、新增文件到倉庫

$ git add readme.txt
登入後複製

2.提交文件到倉庫

$ git commit -m "a new file"
登入後複製

-m後面輸入的是本次提交的說明,提交成功後會顯示:

1 file changed:1個文件被改變(我們新加入的readme.txt檔案);

2 insertions:插入了兩行內容(readme.txt有兩行內容)。

為什麼Git新增檔案需要add,commit總共兩步驟呢?因為commit可以一次提交很多文件,所以你可以多次add不同的文件

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
登入後複製

如果提交的備註寫錯了,可以用以下命令修改剛剛提交的備註

$ git commit --amend
登入後複製

3、修改檔案

將test.txt檔案修改如下:

Hello World ABC
登入後複製

提交

$ git add test.txt
$ git commit -m "append ABC"
登入後複製

每次commit都會產生一個“快照”

4、查看歷史記錄

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: hxk <hxk@gmail.com>
Date:   Fri July 20 21:06:15 2018 +0800

    append ABC

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: hxk <hxk@gmail.com>
Date:   Fri July 20 20:59:18 2018 +0800

    a new file
登入後複製

git log顯示最近到最遠的提交日誌,我們可以看到兩次提交,最後一次是append ABC

git的版本號碼是用SHA1計算出來的一個16進位數

如果嫌輸出資訊太多,可以加上--pretty=oneline

$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append ABC
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 a new file
登入後複製

5、回退歷史版本

$ git reset
登入後複製

首先,Git必須知道目前版本是哪個版本,在Git中,用HEAD表示目前版本,也就是最新的提交1094adb...,上一個版本就是HEAD^,上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不清,所以寫成HEAD~100

回退上一版本

$ git reset --hard HEAD^
HEAD is now at eaadf4e a new file
登入後複製

 這時再查看歷史版本

$ git log
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: hxk <hxk@gmail.com>
Date:   Fri July 20 20:59:18 2018 +0800

    a new file
登入後複製

之前那個版本已經看不到了,這時如果想回到之前那個版本,需要知道版本號,git內部有個指向目前版本的head指針,將指針從目前版本指回去,所以git回退版本特別快

$ git reset --hard 1094adb7
登入後複製

 6、查看歷史指令

要是不記得剛才的版本號碼了,可以使用以下指令:

$ git reflog
登入後複製

7、檢視狀態

$ git status
登入後複製
登入後複製

四、工作區和暫存區

Git和SVN的一個不同之處就是有暫存區的概念

名詞解釋:

工作區(Working Directory):指的是電腦裡能看到的目錄,例如mymenu資料夾就是一個工作區

版本庫(Repository):.git目錄,Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的指標叫做HEAD

 

git add是把需要提交的檔案加入暫存區

git commit是把暫存區的所有內容提交到目前分支

-------------------------測試一下------------- -------------

在工作區新增一個testfile文字檔案

先用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:   test.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    testfile

no changes added to commit (use "git add" and/or "git commit -a")
登入後複製

Git非常清楚地告訴我們,test.txt被修改了,而testfile還從來沒有被添加過,所以它的狀態是Untracked

將testfile提交後再查看狀態

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   testfile
    modified:   test.txt
登入後複製

提交後沒有對工作區進行修改的話,查看狀態,工作區是乾淨的

$ git status
On branch master
nothing to commit, working tree clean
登入後複製

----- --------------------------測試結束---------------------- --------------

五、修改

1、管理修改

#

那么,为什么说git比svn优秀呢?因为git跟踪并管理的是修改,而不是文件

修改test.txt文件内容,添加一行

$ cat test.txt
Hello World ABC
This is the second line
登入後複製

然后添加文件

$ git add test.txt
登入後複製

再次修改test.txt

$ cat test.txt
Hello World ABC
This is the second line
This is the third line
登入後複製

提交

$ git commit -m "test add lines"
登入後複製

这时我们发现,第二次的修改未提交,这是为什么呢?

第一次修改-->git add-->第二次修改-->git commit

add将工作区的修改存入暂存区,但是第二次修改并未存入暂存区,git commit只负责把暂存区的修改提交,所以正确的顺序应该是:

第一次修改 --> git add --> 第二次修改 --> git add --> git commit

提交后,查看工作区和版本库里面最新版本的区别:

$ git diff HEAD -- test.txt
登入後複製

2、撤销修改

1)丢弃工作区的修改 git checkout -- file(--很重要,没有--,就变成了“切换到另一个分支”的命令

$ git checkout -- test.txt
登入後複製
登入後複製

命令git checkout -- test.txt意思就是,把test.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是test.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是test.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

2)把暂存区的修改撤销掉(unstage),重新放回工作区 git reset HEAD <file>

$ git reset HEAD test.txt
Unstaged changes after reset:
M    test.txt
登入後複製

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

3、删除文件

工作区中删除文件

$ rm test.txt
登入後複製

一是要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

$ git rm test.txt
$ git commit -m "remove test.txt"
登入後複製

二是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt
登入後複製
登入後複製

git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

PS: 手动删除文件,然后使用git rm 和git add效果是一样的。

六、分支管理

1、创建与合并分支

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

------------------------------------测试开始---------------------------------------------------

1)创建分支 git branch

切换分支 git checkout

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev
Switched to a new branch &#39;dev&#39;
登入後複製

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch &#39;dev&#39;
登入後複製

2)查看分支 git branch

然后,用git branch命令查看当前分支:

$ git branch
* dev
  master
登入後複製

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对test.txt做个修改,再提交,dev分支的工作完成后,我们就可以切换回master分支:

$ git checkout master
Switched to branch &#39;master&#39;
登入後複製

切换回master分支后,再查看一个test.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

3)合并某个分支到当前分支 git merge

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
登入後複製

git merge命令用于合并指定分支到当前分支。合并后,再查看test.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

4)删除分支 git branch -d

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).
登入後複製

删除后,查看branch,就只剩下master分支了:

$ git branch
* master
登入後複製

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

2、解决冲突

创建一个新的分支feature1

$ git checkout -b feature1
Switched to a new branch &#39;feature1&#39;
登入後複製

将test.txt修改了一下,加上“AND Simple”,在feature1分支上提交

Hello World ABC
This is the second line AND Simple
登入後複製

切换到master分支

$ git checkout master
登入後複製

在master分支上,将test.txt的最后一行加上“& Simple”,提交:

Hello World ABC
This is the second line & Simple
登入後複製

当两个分支都分别有了新的提交,如下图所示:

这种情况下无法进行快速合并,只能试图把各自的修改合并起来,这样有可能会造成冲突:

$ git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
登入後複製

这时我们必须手动解决冲突后再提交,git status可以查看冲突的文件:

$ git status
On branch master
Your branch is ahead of &#39;origin/master&#39; by 2 commits.
  (use "git push" to publish your local commits)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")
登入後複製

查看test.txt文件的内容:

Hello World ABC
<<<<<<< HEAD
This is the second line & Simple
=======
This is the second line AND Simple
>>>>>>> feature1
登入後複製

Git用<<<<<<<=======标记出不同分支的内容,我们修改如下后保存:

This is the second line and Simple
登入後複製

再提交

$ git add test.txt 
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed
登入後複製

现在,master分支和feature1分支变成了下图所示:

用git log --graph --pretty=oneline --abbrev-commit可以看到分支的合并情况,包括分支合并图(--graph)、一行显示(--pretty=oneline)、提交校验码缩略(--abbrev-commit)显示:

$ git log --graph --pretty=oneline --abbrev-commit
*   cf810e4 (HEAD -> master) conflict fixed
|\  
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/  
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append ABC
* eaadf4e a new file
登入後複製

最后,删除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was 14096d0).
登入後複製

3、分支管理策略

通常,合并分支时,Git会用快速合并模式(Fast forward),但这种模式下,删除分支后,会丢掉分支信息。

如果用普通合并模式,从分支历史上就可以看出分支信息。

那么,如何使用普通合并模式呢?我们可以用--no-ff参数

$ git merge --no-ff -m "merge with no-ff" dev
登入後複製

不使用Fast forward模式,merge后就像这样:如下图所示:

分支策略

master分支是最稳定的,只能用于发布新版本,平时不能在上面进行开发,要在新建的分支上进行开发,比如dev,这时dev是不稳定的,到产品1.0发布时,将dev分支和master分支合并,在master分支上发布1.0版本。

所以团队合作的分支看起来就像这张图一样:

4、bug分支

修复bug时,我们会创建一个bug分支进行修复,修复完合并,删除分支。

如果手头上有未完成的工作,先把工作现场git stash一下:

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
登入後複製

查看下工作区是否干净

$ git status
登入後複製
登入後複製

等bug修复完分支删除后,我们先查看下stash

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge
登入後複製

恢复工作现场

1)用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除

可以多次stash,恢复指定的stash;

$ git stash apply stash@{0}
登入後複製

2)用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop
登入後複製

5、Feature分支

开发一个新功能,需要新建一个分支。

如果这个功能还未合并就要取消,要使用-D强行删除

$ git branch -D 分支名
登入後複製

6、多人协作

当你从远程克隆时,git自动把本地master分支和远程master分支对应起来,远程仓库默认名为origin

1)查看远程库的信息

$ git remote
登入後複製

查看远程库的详细信息

$ git remote -v
登入後複製

2)推送分支

将本地master分支推送到远程库

如果不推送到远程,本地分支对于其它人就是不可见的

$ git push origin master
登入後複製

3)抓取分支

如果本地分支推送到远程库的文件有冲突,推送失败,我们就得先从远程库中抓取最新的提交合并到本地,解决冲突再提交。

$ git pull
登入後複製

如果git pull报错:没有指定本地分支与远程分支的链接,我们就要手动设置一下

git branch --set-upstream-to=origin/<远程分支名> 本地分支名
登入後複製

4)Rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;

目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

$ git rebase
登入後複製

和merge的对比示意图如下:

merge-->

一起來看看史上最詳細Git使用教學課程

rebase-->

一起來看看史上最詳細Git使用教學課程

七、标签管理

切换到需要打标签的分支上

1)新建一个标签(默认为HEAD,也可以指定一个commit id)

创建带有说明的标签,用-a指定标签名,-m指定说明文字

$ git tag <标签名>
$ git tag <标签名> <commit id>
$ git tag -a <标签名> -m "备注"
登入後複製

2)查看标签

标签不是按时间顺序列出,而是按字母排序的。

git tag查看所有标签,用git show 标签名查看指定的某个标签信息

$ git tag
$ git show <标签名>
登入後複製

PS:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

3)删除标签

创建的标签都只存储在本地,不会自动推送到远程,所以打错的标签可以在本地安全删除;

$ git tag -d <标签名>
登入後複製

如果标签已经推送到远程,要先从本地删除,再从远程删除

$ git tag -d <标签名>
$ git push origin :refs/tags/<标签名>
登入後複製

4)推送标签到远程

推送某个标签到远程 git push origin <tagname>

推送全部尚未推送到远程的本地标签 git push origin --tags

$ git push origin <标签名>
$ git push origin --tags
登入後複製

以上。

To be continued...

以上是一起來看看史上最詳細Git使用教學課程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

git怎麼更新代碼 git怎麼更新代碼 Apr 17, 2025 pm 04:45 PM

更新 git 代碼的步驟:檢出代碼:git clone https://github.com/username/repo.git獲取最新更改:git fetch合併更改:git merge origin/master推送更改(可選):git push origin master

git怎麼下載項目到本地 git怎麼下載項目到本地 Apr 17, 2025 pm 04:36 PM

要通過 Git 下載項目到本地,請按以下步驟操作:安裝 Git。導航到項目目錄。使用以下命令克隆遠程存儲庫:git clone https://github.com/username/repository-name.git

git vs. github:版本控制和代碼託管 git vs. github:版本控制和代碼託管 Apr 11, 2025 am 11:33 AM

Git是版本控制系統,GitHub是基於Git的代碼託管平台。 Git用於管理代碼版本,支持本地操作;GitHub提供在線協作工具,如Issue跟踪和PullRequest。

git怎麼合併代碼 git怎麼合併代碼 Apr 17, 2025 pm 04:39 PM

Git 代碼合併過程:拉取最新更改以避免衝突。切換到要合併的分支。發起合併,指定要合併的分支。解決合併衝突(如有)。暫存和提交合併,提供提交消息。

git怎么生成ssh密鑰 git怎么生成ssh密鑰 Apr 17, 2025 pm 01:36 PM

為了安全連接遠程 Git 服務器,需要生成包含公鑰和私鑰的 SSH 密鑰。生成 SSH 密鑰的步驟如下:打開終端,輸入命令 ssh-keygen -t rsa -b 4096。選擇密鑰保存位置。輸入密碼短語以保護私鑰。將公鑰複製到遠程服務器上。將私鑰妥善保存,因為它是訪問帳戶的憑據。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

git commit怎麼用 git commit怎麼用 Apr 17, 2025 pm 03:57 PM

Git Commit 是一種命令,將文件變更記錄到 Git 存儲庫中,以保存項目當前狀態的快照。使用方法如下:添加變更到暫存區域編寫簡潔且信息豐富的提交消息保存並退出提交消息以完成提交可選:為提交添加簽名使用 git log 查看提交內容

git下載不動怎麼辦 git下載不動怎麼辦 Apr 17, 2025 pm 04:54 PM

解決 Git 下載速度慢時可採取以下步驟:檢查網絡連接,嘗試切換連接方式。優化 Git 配置:增加 POST 緩衝區大小(git config --global http.postBuffer 524288000)、降低低速限制(git config --global http.lowSpeedLimit 1000)。使用 Git 代理(如 git-proxy 或 git-lfs-proxy)。嘗試使用不同的 Git 客戶端(如 Sourcetree 或 Github Desktop)。檢查防火

See all articles