Git 常用基礎命令詳解:init、add、commit

一、引言

在軟件開發的世界里,版本控制是一項至關重要的技術,它就像是一個時光機器,讓開發者能夠追蹤代碼的每一次變化,輕松回溯到任意歷史版本,同時也為多人協作開發提供了強大的支持。而 Git,作為目前最流行的分布式版本控制系統,已經成為了開發者們不可或缺的工具。無論是小型項目還是大型企業級應用,Git 都能發揮其強大的功能,幫助團隊高效地管理代碼。

在 Git 的眾多命令中,init、add和commit是最為基礎且常用的命令,它們構成了 Git 版本控制的核心操作。掌握這些命令,就相當于拿到了開啟 Git 強大功能的鑰匙。接下來,讓我們深入探索這三個命令的奧秘。

二、git init:初始化你的代碼世界

2.1 基本概念

git init是 Git 中用于初始化新倉庫的命令 ,它就像是為你的項目打造了一個專屬的 “代碼時光寶盒”,開啟了對項目文件的版本控制之旅。當你在一個項目目錄下執行git init時,Git 會在該目錄下創建一個隱藏的.git目錄,這個目錄是 Git 倉庫的核心,包含了所有用于跟蹤和管理項目版本的文件和目錄,如對象數據庫、引用、配置文件等。簡單來說,它是你進行所有版本控制操作的基礎,沒有它,Git 就無法記錄你的代碼變化。

2.2 使用場景

git init命令主要應用于兩種場景:

  • 新項目的開始:當你著手一個全新的項目時,使用git init在本地創建一個新的 Git 倉庫,從此可以利用 Git 管理項目的版本控制和歷史記錄,包括代碼的提交、分支管理、合并等,便于更好地組織和協作開發代碼,同時保留所有歷史版本的備份。
  • 對已有項目引入 Git 版本控制:若你已經有一個項目,希望將其納入 Git 版本控制體系,可使用git init初始化一個新的 Git 倉庫,隨后通過git add命令將項目中的文件添加到暫存區,再用git commit命令提交這些修改到 Git 倉庫,從而實現對項目版本的有效管理,方便與他人協作開發。

2.3 操作示例

假設我們在桌面上有一個名為my_project的文件夾,里面存放著我們的項目代碼,現在我們要將其初始化為一個 Git 倉庫,具體步驟如下:

  1. 打開終端,切換到my_project目錄:
 

cd ~/Desktop/my_project

  1. 執行git init命令:
 

git init

執行結果如下:

 

Initialized empty Git repository in /Users/your_username/Desktop/my_project/.git/

這表明我們已經成功初始化了一個空的 Git 倉庫,在my_project目錄下會生成一個隱藏的.git目錄,使用ls -a命令可以查看。

2.4 常見問題及解決

在使用git init時,可能會遇到以下問題:

  • 權限不足:如果在執行git init時,沒有對目標目錄的寫權限,會導致初始化失敗。例如,在一個受系統保護的目錄下執行git init,就會出現權限錯誤。解決方法是確保你對要初始化倉庫的目錄擁有足夠的權限,你可以通過修改目錄權限或切換到有寫權限的目錄來解決。比如,將項目移動到用戶主目錄下的某個文件夾,或者使用sudo命令(需謹慎使用,可能會帶來安全風險)提升權限,但要注意sudo可能會導致文件所有者和權限的變化。
  • 目錄已存在 Git 倉庫:如果在一個已經存在.git目錄的文件夾中再次執行git init,雖然不會覆蓋已有的內容,但可能會產生一些混淆。此時,你需要確認是否真的需要重新初始化,或者直接使用已有的 Git 倉庫進行操作。

三、git add:將修改納入管理軌道

3.1 基本概念

在 Git 的工作流程中,git add命令起著橋梁的作用,它將工作區中修改的文件添加到暫存區(也稱為索引區) 。暫存區是一個臨時的存儲區域,位于.git目錄下的index文件中,它充當了工作區和版本庫之間的緩沖區。當你在工作區對文件進行了修改、新增或刪除操作后,這些變化不會立即被記錄到版本庫中,而是需要通過git add命令將這些文件標記為下次提交的一部分,即將它們添加到暫存區。簡單來說,git add就是告訴 Git,你希望將這些文件的當前狀態包含在下一次的提交中。

3.2 常用參數解析

  • git add.:這是最常用的參數之一,它表示將當前目錄及其子目錄下的所有修改、新增和刪除的文件都添加到暫存區。這里的.代表當前目錄,使用這個命令可以快速地將所有相關文件納入暫存區,適用于一次性提交多個文件的場景。
  • git add -u:-u是--update的縮寫,該參數只將已經被 Git 跟蹤的文件的變動提交到暫存區,對于新建的文件,它不會包含在內。這個參數適用于你只想更新已有文件的修改,而不處理新文件的情況,比如你對項目中的一些源文件進行了修改,只想提交這些修改,而不涉及新添加的測試文件等。
  • git add -A:-A是--all的縮寫,它會提交所有被刪除、被替換、被修改和新增的文件到暫存區,相比git add.,它不僅包含當前目錄下的所有變化,還能處理那些在子目錄中被刪除的文件(git add.在使用rm命令刪除文件時,不會自動將刪除操作添加到暫存區,除非使用git rm命令刪除文件),功能更為全面。

3.3 操作示例

假設我們在my_project項目中進行如下操作:

  1. 創建一個新文件test.txt,并寫入一些內容:
 

echo "This is a test file." > test.txt

  1. 查看當前文件狀態:
 

git status

輸出結果如下:

 

On branch master

Untracked files:

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

test.txt

nothing added to commit but untracked files present (use "git add" to track)

可以看到test.txt文件處于未跟蹤狀態。

3. 使用git add.將所有文件添加到暫存區:

 

git add.

  1. 再次查看文件狀態:
 

git status

輸出結果如下:

 

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

new file: test.txt

此時test.txt文件已經被添加到暫存區,狀態變為 “new file”,表示這是一個新添加到暫存區的文件。

3.4 與文件狀態的關系

結合git status命令,可以更好地理解git add對文件狀態的改變。在執行git add之前,文件可能處于未跟蹤(untracked)、已修改(modified)但未暫存的狀態。當執行git add后,未跟蹤的文件會變為已跟蹤并暫存(staged)狀態,已修改的文件會將修改部分添加到暫存區,文件狀態也變為已暫存。例如,我們對test.txt文件進行修改:

 

echo "Modify the test file." >> test.txt

查看狀態:

 

git status

輸出:

 

On branch master

Changes not staged for commit:

(use "git add <file>..." to update what will be committed)

modified: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

可以看到文件處于已修改但未暫存狀態,執行git add test.txt后:

 

git status

輸出:

 

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

modified: test.txt

此時文件狀態變為已暫存,等待提交。

3.5 撤銷操作

如果不小心將錯誤的文件添加到了暫存區,或者想要撤銷之前的git add操作,可以使用git reset命令 。例如,要撤銷對test.txt文件的添加操作,可以執行:

 

git reset test.txt

如果要撤銷所有暫存區的更改,回到工作區狀態,可以執行:

 

git reset

需要注意的是,git reset命令會將暫存區的內容恢復到上一次提交的狀態,謹慎使用,以免丟失未提交的修改。

四、git commit:記錄代碼的關鍵時刻

4.1 基本概念

當你在工作區完成了一系列的代碼修改,并使用git add將這些修改添加到暫存區后,接下來就需要使用git commit命令將暫存區的文件提交到本地倉庫,正式記錄下代碼的這一次變更 。每一次的git commit操作都會在版本歷史中創建一個新的提交對象,這個對象包含了本次提交的作者、提交時間、提交說明以及所涉及的文件變更等信息,它是版本控制的關鍵節點,就像是歷史長河中的里程碑,標記著項目代碼在不同時刻的狀態。

4.2 提交信息的重要性

清晰、有意義的提交信息對于代碼管理和團隊協作至關重要。一個好的提交信息應該能夠準確地描述本次提交所做的修改,讓其他開發者(包括未來的自己)能夠快速了解這次變更的目的和內容。例如,“修復了用戶登錄時密碼錯誤提示不明確的問題” 就比 “小修小補” 這樣的提交信息更具價值。在團隊開發中,詳細的提交信息有助于代碼審查、問題追蹤和版本回溯,提高開發效率和代碼質量。

4.3 常用參數解析

  • -m:這是最常用的參數,用于指定提交信息。例如git commit -m "添加了用戶注冊功能",其中雙引號內的內容就是提交信息,簡潔明了地描述了本次提交的主要內容。
  • -a:-a是--all的縮寫,使用git commit -a時,它會自動將所有已經被 Git 跟蹤且修改過的文件添加到暫存區并提交,跳過了git add這一步驟,但它不會提交新創建的文件(即未跟蹤的文件)。這個參數適用于你已經確定所有修改都需要提交,且沒有新文件需要添加的情況,能簡化提交流程。
  • --amend:--amend參數用于修改最近一次的提交 。它有兩個主要用途:一是當你發現上次提交的信息有誤,或者遺漏了某些文件時,可以使用git commit --amend,在不產生新的提交記錄的情況下,將新的修改或正確的提交信息追加到上一次提交中;二是當你希望合并連續的多次提交時,也可以使用這個參數,通過多次--amend操作,將多個小的提交合并為一個更有意義的大提交,使提交歷史更加清晰簡潔。但需要注意的是,使用--amend會改變提交的哈希值,所以如果已經將提交推送到遠程倉庫,謹慎使用此參數,以免與遠程倉庫產生沖突。

4.4 操作示例

繼續上面的my_project項目示例,在執行git add.將test.txt文件添加到暫存區后,我們執行git commit命令提交修改:

 

git commit -m "添加了test.txt文件"

執行結果如下:

 

[master (root-commit) 596d8c2] 添加了test.txt文件

1 file changed, 1 insertion(+)

create mode 100644 test.txt

這里[master (root-commit) 596d8c2]表示在master分支上創建了一個根提交(因為這是倉庫的第一次提交),596d8c2是這次提交的哈希值,后面的信息表示有 1 個文件被更改,插入了 1 行內容,創建了一個新文件test.txt。

如果我們后續又對test.txt文件進行了修改,比如添加了一行內容:

 

echo "Another line in test.txt" >> test.txt

然后使用git commit -a直接提交修改(假設沒有新文件需要添加):

 

git commit -a -m "修改了test.txt文件,添加了新內容"

執行結果如下:

 

[master 7c8a7e4] 修改了test.txt文件,添加了新內容

1 file changed, 1 insertion(+)

這樣就完成了對test.txt文件修改的提交。

4.5 提交歷史管理

使用git log命令可以查看提交歷史,它會按時間順序列出所有的提交記錄,包括每次提交的哈希值、作者、提交時間和提交信息等。例如,在my_project項目中執行git log:

 

git log

輸出結果如下:

 

commit 7c8a7e467f8c2c87c2d999c267c2c167d8d6e7a4 (HEAD -> master)

Author: your_name <your_email@example.com>

Date: Tue Nov 19 16:25:12 2024 +0800

修改了test.txt文件,添加了新內容

commit 596d8c2d8c2d8c2d8c2d8c2d8c2d8c2d8c2d8c2d (root-commit)

Author: your_name <your_email@example.com>

Date: Tue Nov 19 16:23:05 2024 +0800

添加了test.txt文件

git log還有一些常用參數,如-p用于顯示每次提交的詳細差異;--oneline以簡潔的單行形式顯示提交歷史,只包含提交哈希值和提交信息;--graph以圖形化方式展示分支和合并歷史,便于直觀地了解項目的開發脈絡。例如,使用git log --oneline查看提交歷史:

 

git log --oneline

輸出:

 

7c8a7e4 修改了test.txt文件,添加了新內容

596d8c2 添加了test.txt文件

這樣可以更簡潔地查看提交歷史,快速了解項目的變更情況。

五、綜合示例:完整的版本控制流程

5.1 項目初始化

假設我們要開始一個名為my_project的新 Python 項目,首先在本地創建一個新目錄:

 

mkdir my_project

cd my_project

然后使用git init初始化 Git 倉庫:

 

git init

此時,我們的項目目錄下會生成一個隱藏的.git目錄,這標志著我們的項目已經可以進行版本控制了。

5.2 文件添加與修改

接下來,我們在項目中創建一個 Python 文件main.py,并寫入一些簡單的代碼:

 

print("Hello, Git!")

使用git add命令將main.py文件添加到暫存區:

 

git add main.py

再使用git commit命令提交修改,添加有意義的提交信息:

 

git commit -m "初始化項目,添加了main.py文件"

此時,我們的第一次提交已經完成,代碼的初始狀態被記錄在版本庫中。

如果我們后續對main.py文件進行修改,比如添加一行代碼:

 

print("Hello, Git!")

print("This is a modified version.")

修改后,再次使用git add和git commit命令來記錄這次修改:

 

git add main.py

git commit -m "修改了main.py文件,添加了新的打印信息"

5.3 模擬開發過程中的變更

在實際開發中,我們會不斷地對代碼進行修改。假設我們又對main.py進行了如下修改,添加一個函數:

 

def greet():

print("Welcome to my project!")

print("Hello, Git!")

print("This is a modified version.")

greet()

這次我們先使用git status查看文件狀態,確認main.py文件已被修改:

 

git status

然后使用git add將修改添加到暫存區,這里我們也可以使用git add.來添加當前目錄下的所有修改:

 

git add main.py

最后使用git commit提交修改,并詳細描述提交信息:

 

git commit -m "在main.py中添加了greet函數,用于打印歡迎信息"

通過這樣的操作,我們可以清晰地記錄每次代碼變更,方便后續的版本管理和回溯。

六、總結與拓展

6.1 命令回顧

  • git init:用于初始化一個新的 Git 倉庫,在指定目錄下創建一個隱藏的.git目錄,標志著項目可以開始進行版本控制。它是使用 Git 進行版本管理的第一步,為后續的操作奠定基礎。
  • git add:將工作區的文件添加到暫存區,是連接工作區和版本庫的橋梁。通過git add,我們可以選擇將哪些修改納入到下一次的提交中,它支持多種參數,如git add.添加當前目錄下所有文件,git add -u只添加已跟蹤文件的修改,git add -A添加所有變化(包括新建、修改和刪除的文件) 。
  • git commit:將暫存區的文件提交到本地倉庫,記錄代碼的變更。每次提交都需要添加有意義的提交信息,通過-m參數指定,例如git commit -m "修復了登錄頁面的樣式問題"。git commit還有一些常用參數,如-a可以跳過git add步驟,直接提交已跟蹤文件的修改;--amend用于修改最近一次的提交 。

6.2 學習建議

學習 Git 最好的方法就是實踐,建議讀者在實際項目中不斷運用這些命令,加深理解和記憶。可以嘗試創建一些小型項目,模擬不同的開發場景,如多人協作、分支管理等,通過實際操作來熟悉 Git 的工作流程和命令使用。同時,遇到問題時不要害怕,多查閱官方文檔和相關資料,積極尋求解決方案,這也是學習和成長的過程。

6.3 后續學習方向

掌握了init、add和commit這三個基礎命令后,還有很多 Git 的強大功能等待你去探索,比如分支管理(git branch、git checkout等)、遠程倉庫操作(git remote、git push、git pull等)、沖突解決、變基操作等。這些高級功能將進一步提升你在團隊開發中的效率和協作能力,希望讀者能夠繼續深入學習,成為 Git 使用的高手 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/68131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/68131.shtml
英文地址,請注明出處:http://en.pswp.cn/web/68131.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1-kafka服務端之延時操作前傳--時間輪

文章目錄 背景時間輪層級時間輪時間輪降級kafka中的時間輪kafka如何進行時間輪運行 背景 Kafka中存在大量的延時操作&#xff0c;比如延時生產、延時拉取和延時刪除等。Kafka并沒有使用JDK自帶的Timer或DelayQueue來實現延時的功能&#xff0c;而是基于時間輪的概念自定義實現…

從零開始:OpenCV 圖像處理快速入門教程

文章大綱 第1章 OpenCV 概述 1.1 OpenCV的模塊與功能  1.2 OpenCV的發展 1.3 OpenCV的應用 第2章 基本數據類型 2.1 cv::Vec類 2.2 cv&#xff1a;&#xff1a;Point類 2.3 cv&#xff1a;&#xff1a;Rng類 2.4 cv&#xff1a;&#xff1a;Size類 2.5 cv&#xff1a;&…

網絡工程師 (22)網絡協議

前言 網絡協議是計算機網絡中進行數據交換而建立的規則、標準或約定的集合&#xff0c;它規定了通信時信息必須采用的格式和這些格式的意義。 一、基本要素 語法&#xff1a;規定信息格式&#xff0c;包括數據及控制信息的格式、編碼及信號電平等。這是協議的基礎&#xff0c;確…

vue如何解決跨域

文章目錄 vue如何解決跨域1. 什么是跨域2. 如何解決2.1 CROS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨域資源共享&#xff09;2.2 Proxy2.2.1 使用webpack proxy2.2.2 服務端代理轉發2.2.3 通過nginx實現代理 vue如何解決跨域 1. 什么是跨域 跨域本質是瀏覽器…

算法與數據結構(括號匹配問題)

思路 從題干可以看出&#xff0c;只要給出的括號對應關系正確&#xff0c;那么就可以返回true,否則返回false。這個題可以使用棧來解決 解題過程 首先從第一個字符開始遍歷&#xff0c;如果是括號的左邊&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

在linux 中搭建deepseek 做微調,硬件配置要求說明

搭建 可參考 使用deepseek-CSDN博客 官方網站&#xff1a;DeepSeek DeepSeek 是一個基于深度學習的開源項目&#xff0c;旨在通過深度學習技術來提升搜索引擎的準確性和效率。如果你想在 Linux 系統上搭建 DeepSeek&#xff0c;你可以遵循以下步驟。這里我將提供一個基本的指…

mounted鉤子函數里如何操作子組件的DOM?

在 Vue 的 mounted 鉤子函數中,操作子組件的 DOM 可以通過幾種方式實現,具體取決于對子組件的訪問方式。以下是一些常用的方法: 一、使用 ref 引用 定義 ref在父組件中,給子組件添加一個 ref 屬性,這樣就可以在父組件中通過 this.$refs 訪問到子組件的實例。 父組件示例…

vue2-為啥data屬性是一個函數而不是對象

vue2-為啥data屬性是一個函數而不是對象 1. data在vue實例和組件中的表現差異 vue實例的時候&#xff0c;data既可以是一個對象也可以是一個函數 new Vue({data:{//對象name:tom},data(){//函數return{name:tom}} })而在組件中定義data&#xff0c;只能是函數&#xff0c;如…

利用deepseek參與軟件測試 基本架構如何 又該在什么環節接入deepseek

利用DeepSeek參與軟件測試&#xff0c;可以考慮以下基本架構和接入環節&#xff1a; ### 基本架構 - **數據層** - **測試數據存儲**&#xff1a;用于存放各種測試數據&#xff0c;包括正常輸入數據、邊界值數據、異常數據等&#xff0c;這些數據可以作為DeepSeek的輸入&…

Word List 2

詞匯顏色標識解釋 詞匯表中的生詞 詞匯表中的詞組成的搭配、派生詞 例句中的生詞 我自己寫的生詞&#xff08;用于區分易混淆的詞&#xff0c;無顏色標識&#xff09; 不認識的單詞或句式 單詞的主要漢語意思 不太理解的句子語法和結構 Word List 2 英文音標中文regi…

樹欲靜而鳳不止

我不知道為什么要求一定要在抖音上舉辦婚禮&#xff1f;覺得唯一的一個作用&#xff0c;財力的體現。 做到了&#xff0c;就見了。讓我覺得就像買見面一樣。 見了不合適&#xff0c;該當如何&#xff1f; 這個對于認真找對象&#xff0c;真的很重要嗎&#xff1f; 分錢給平臺&…

kaggle比賽入門 - Spaceship Titanic (第一部分)

1. 導入packages import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns sns.set(styledarkgrid, font_scale1.4) from imblearn.over_sampling import SMOTE import itertools import warnings warnings.filter…

java基礎2(黑馬)

一、變量里的數據在計算機中的存儲原理 1.二進制 .二進制&#xff1a;只有0、1&#xff0c; 按照逢二進一的方式表示數據。 十進制數字11轉換為&#xff1a;1011 方法&#xff1a;除二取余法 計算機中表示數據的最小單元&#xff0c;一個字節&#xff08;Byte&#xff0c;簡…

【戒抖音系列】短視頻戒除-1-對推薦算法進行干擾

如今推薦算法已經滲透到人們生活的方方面面&#xff0c;尤其是抖音等短視頻核心就是推薦算法。 【短視頻的危害】 1> 會讓人變笨&#xff0c;慢慢讓人喪失注意力與專注力 2> 讓人喪失閱讀長文的能力 3> 讓人沉浸在一個又一個快感與嗨點當中。當我們刷短視頻時&#x…

docker安裝es及分詞器ik

系統是macos&#xff0c;docker是docker-desktop 拉取鏡像 docker pull bitnami/elasticsearch 啟動docker鏡像 docker create -e "discovery.typesingle-node" \ --name elasticsearch1 -p 9200:9200 -p 9300:9300 \ bitnami/elasticsearch:8.17.1 測試是否好…

CSS Position(定位)詳解及舉例說明

在CSS中&#xff0c;position屬性用于指定元素的定位類型。通過設置不同的position值&#xff0c;我們可以控制元素在頁面中的布局方式。position屬性有五個常用的值&#xff1a;static、relative、fixed、absolute和sticky。本文將詳細介紹這五種定位方式&#xff0c;并通過實…

AlwaysOn 可用性組副本所在服務器以及該副本上數據庫的各項狀態信息

目錄標題 語句代碼解釋&#xff1a;1. sys.dm_hadr_database_replica_states 視圖字段詳細解釋及官網鏈接官網鏈接字段解釋 2. sys.availability_replicas 視圖字段詳細解釋及官網鏈接官網鏈接字段解釋 查看視圖的創建語句方法一&#xff1a;使用 SQL Server Management Studio…

GPU-Z重磅更新,Blackwell架構全面支持

由TechPowerUp傾力打造的GPU-Z&#xff0c;是一款集顯卡信息查看、實時監控與深度診斷于一體的強大工具。它以其輕巧靈便的體積、完全免費的使用模式以及極其友好的操作界面&#xff0c;贏得了全球無數用戶的青睞與信任&#xff0c;成為PC硬件領域中不可或缺的軟件。 GPU-Z不僅…

c++11總結26——std::regex

std::regex 是 C11 引入的 正則表達式庫&#xff0c;用于 字符串匹配、搜索和替換。 &#x1f539; 頭文件&#xff1a;#include <regex> &#x1f539; 命名空間&#xff1a;std &#x1f539; 支持的匹配模式&#xff1a;ECMAScript&#xff08;默認&#xff09;、POS…

程序詩篇里的靈動筆觸:指針繪就數據的夢幻藍圖<6>

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。 今天我們繼續來學習數組指針變量&#xff0c;二維數組傳參的本質&#xff0c;函數指針變量&#xff0c;…