跳至主要內容

1.入门

Victor Da V约 1803 字

安装 git

1. Linux 安装

# yum 安装
sudo yum install git

# apt-get 安装
sudo apt-get install git

2. Windows 安装

官网下载安装包,进行傻瓜式安装

官网地址:https://git-scm.com/downloadsopen in new window

3. 查看 git

# 查看 git 版本
git --version 

# 获取帮助
git help

4. 配置 git

git 涉及到了多人协作,因此需要配置自己的用户信息(用户名和邮箱),让协作者知道你是谁。

# 配置用户名
git config [--global] user.name "Aaron"
# 配置用户邮箱(可以不是真实的)
git config [--global] user.email Aaron@gmail.com

# 查看某个配置信息
git config <key>
git config user.name

# 查看所有配置信息
git config --list

细节:

  • 如果使用了 --global 选项,那么该命令将应用到整个 Git 系统
  • 项目级别/仓库级别:仅在当前本地库范围内有效。设置时, 要将路径切换到本地库路径
  • 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名

git 初始化

初始化就是将当前目录(包括子目录)交给 git 托管。

可以将本地目录进行 git 初始化,也可以直接从远程库(如 GitHub)克隆已经被 git 托管的项目,初始化前需要先进行用户信息的配置。

1. 本地库初始化

在需要被托管的目录内,右键进入 git 命令行 git bash here

$ git init 
Initialized empty Git repository in ...

初始化时在目标文件夹下创建了一个 .git 的隐藏目录,该目录就是版本库。

2. 克隆远程库

详见:3.远程库

# 就是远程库的地址,支持多种协议
git clone url

暂存与提交

1. add 暂存

git add 命令将工作区中文件的“新建/修改”添加到暂存区。可以用它开始跟踪新文件,或者把已跟踪的文件的更改放到暂存区。

# .代表所有文件,将所有的更改一次性全部添加到暂存区
$ git add .

# 可以仅将指定的文件或目录添加到暂存区
$ git add README

2. commit 提交

git commit 命令将暂存区(git add 后被追踪)的文件,提交到版本库,

$ git commit -m "本次提交的说明信息"

[master 463dc4f] 本次提交的说明信息 # [分支 哈希] commit message
2 files changed, 2 insertions(+) # 2 个文件被修订,增加了 2 行
create mode 100644 README # 创建模式

每一次 commit 操作,都是对项目作一次快照,也就是创建一次版本。

3. 暂存的同时提交

可以将 git add .git commit 何在一起使用

git commit -a "提交信息"

弊端:省掉 add,就不能撤销了

文件状态

1. 文件的生命周期

工作目录下的每一个文件都不外乎这两种状态:已追踪未追踪

image-20240325005356442
image-20240325005356442
  • Untracked(未追踪):新增且未放入暂存区(add)的文件
  • Tracked(已追踪) :已跟踪的文件是指那些被纳入了版本控制的文件。
    • Staged(放入暂存区):将修改过的文件放入暂存区
    • Unmodified(提交修改):将暂存区记录的文件修改提交到库
    • Modified(修改文件):已纳入版本管理的文件,再次被修改

PS:克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件

2. Status 查看文件状态

git status 命令可以检查当前文件所处的状态

$ git status

# 紧凑模式的状态信息
$ git status -s

可能出现的状态

  • Untracked files:未跟踪的文件
  • Changes not staged for commit: 已追踪的文件进行了更新,还未暂存此更新
  • Changes to be committed:已 add 的 change 或新文件可以进行 commit

3. 常见状态解析

1)未修改文件,初次使用 status 命令

$ git status
On branch master # 在主线
nothing to commit, working directory clean #工作区很干净,

上面的表明,当前目录下没有出现任何处于未跟踪状态的新文件,该命令还显示了当前所在分支(master),并告诉你这个分支同远程服务器上对应的分支没有偏离。

PS:commit 后,进行 git status,也是这种效果

2)新文件未 add 时使用 status 命令

$ git status
On branch master
Untracked files: # 未跟踪的文件。
     (use "git add <file>..." to include in what will be committed)
     README  # 新建的 README 文件出现在 Untracked files 下面
nothing added to commit but untracked files present (use "git add" totrack)

新增的文件处于未追踪状态 Untracked

3)git add 后的 status 信息

$ git status
On branch master
Changes to be committed: # 以下文件已处于暂存状态
  (use "git reset HEAD <file>..." to unstage)
        modified:   a.txt
        new file:   b.txt
  • new file:该文件为新被追踪的文件,
  • modified:之前追踪的文件内容发生了变化已被 git add

4)add 后,再次修改后的 status 信息

git status
On branch master
Changes to be committed:
 (use "git reset HEAD <file>..." to unstage)
     new file: README
     modified: shit.md
Changes not staged for commit:
 (use "git add <file>..." to update what will be committed)
 (use "git checkout -- <file>..." to discard changes in workingdirectory)
     modified: shit.md

shit.md 文件同时出现在暂存区和非暂存区。git 只不过暂存了你运行 git add 命令时的版本,如果现在提交,shit.md 的版本是你最后一次运行 git add 命令时的那个版本,而不是你运行 git commit 时,在工作目录中的当前版本。运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来。

撤销操作

撤销一些 git 命令(并非是版本回退)。

1. 重新 commit

用于 git commit 后

提交完了才发现漏掉了几个文件没有提交,或者提交信息写错了,此时,可以运行带有 --amend 选项的提交命令尝试重新提交,具体流程如下:

  • commit:提交
  • 发现之前的提交有问题
  • 修改问题
    • 提交信息问题,直接调用--amend,重新填写提交信息
    • 操作问题,进行操作(撤销、删改文件、git add 等)
  • 调用 git commit --amend 重新提交
$ git commit --amend -m "new message"
$ git commit --amend  --no-edit # 直接重新提交,不修改提交信息

2. 取消暂存

用户 git add 后

将暂存区的文件恢复到工作目录,相当于回到上次 git add

git reset HEAD 文件名或.

# 强制取消暂存
git reset HEAD 文件名或. --hard

PS:如果这时候工作目录的文件修改过,取消暂存,不会产生覆盖,仅仅是撤销了暂存,当添加 了 --hard 强制取消暂存,就会将工作目录里的修改强制覆盖。

3. 撤销文件的修改

用于 git add 前对文件的修改

撤销文件的修改,指的是将工作目录的文件恢复成上次提交时的状态,对文件所有的修改都将遗失。

git checkout 文件名; # 方式 1
git checkout . ; # 撤销所有文件

git restore 文件名; # 方式 2: 通过版本穿梭
git restore .;

该命令有一点危险,建议在分支里保存好进度。