【Git】:基础操作篇

时间:2022-07-28
本文章向大家介绍【Git】:基础操作篇,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
1. 设置用户身份
2. Clone 现有仓库
3. 记录变更
    3.1. Git 文件状态
    3.2. 查看当前文件状态
    3.3. 添加变更到下一次提交
    3.4. 提交变更
    3.5. 移除文件
    3.6. 查看已暂存、未暂存的变更
    3.7. 查看提交历史
4. 忽略文件
5. 撤销操作
    5.1. 刚才的commit漏了一个文件
    5.2. 刚才失误暂存了,想取消
    5.3. 刚才失误修改了,想回滚
6. 远程仓库的使用
    6.1. 显示远程仓库
    6.2. 查看远程仓库详细信息
    6.3. 添加远程仓库
    6.4. 修改远程仓库地址
    6.5. 删除远程仓库
    6.6. 从远程仓库拉取
    6.7. 推送到远程仓库
7. 分支操作    
    7.1. 创建新分支
    7.2. 当前分支
    7.3. 切换分支
    7.4. 分支合并——快进合并
    7.5. 分支合并——基本合并
    7.6. 分支合并——冲突处置
    7.7. 变基
8. 远程分支
    8.1. 创建跟踪分支
    8.2. 拉取
    8.3. 推送
    8.4. 删除远程分支

1. 设置用户身份

安装好 Git 后的第一件事就是设置用户名和电子邮件地址。这一步非常重要,因为 Git 的每一次提交都需要用到这些信息,而且还会被写入到所创建的提交中,不可更改。

设置:

git config --global user.name "webj2ee"
git config --global user.email "webj2ee@qq.com"

查看:

git config -l --global

结果:

2. Clone 现有仓库

如果需要获取现有仓库的一份副本,可以使用 git clone 命令。

  • git clone 默认会从服务器上把整个项目历史中每个文件的所有历史版本都拉取下来。
git clone https://github.com/webj2eedev/git-demo.git

3. 记录变更

3.1. Git 文件状态

工作目录下的每一个文件都处于两种状态之一:

  • 已跟踪(tracked)
    • 未修改(unmodified)
    • 已修改(modified)
    • 已暂存(staged)
  • 未跟踪(untracked)

3.2. 查看当前文件状态

检查文件所处状态的主要工具是 git status 命令。

git status
  • "Changes to be commited":已暂存的文件。
  • "Changes not staged for commit":处于跟踪状态的文件在工作目录下已被修改。
  • "Untracked files":未跟踪的文件
git status -s // 紧凑形式显示状态
  • 注:文件列表旁边的标记是分成两列的
    • 左列标明了文件是否已缓存
    • 右列标明了文件是否已修改

3.3. 添加变更到下一次提交

git add 是一个多功能命令,既可以用来跟踪新文件,也可以用来暂存文件,它还可以做其他的一些事情,比如把存在合并冲突的文件标记为已解决。所以,把 git add 命令看成“添加内容到下一次提交中”更有助于理解该命令。

git add <pathspec>...

3.4. 提交变更

git commit -m "xxxx"

注:给 git commit 命令传入 -a 选项,就能让 Git 自动把已跟踪的所有文件添加到暂存区,然后再提交,这样你就不用再执行 git add 了。

git commit -a -m "xxxx"

3.5. 移除文件

要从 git 中移除某个文件,你需要把它从以跟踪文件列表中移除(确切地说,是从暂存区中移除),然后再提交。git rm 会帮你完成这些操作。

  • 文件已经被手动删除
    • git add + git commit 即可
  • git rm 会把文件从工作目录中删除
  • 如果你只是想从暂存区中移除文件,并且把文件保留在工作目录,只需要使用 --cached 选项。(这个技能常用在处理 .gitignore 上)
  • 如果想删除文件夹,还得使用 -r 选项。

3.6. 查看已暂存、未暂存的变更

如果想要知道具体的修改内容,而不仅仅是泛泛的知道更改改了哪些文件,可以使用 git diff 命令。

  • 查看尚未暂存的变更:git diff
  • 查看已暂存的变更:git diff --cached
    • 注:git diff --staged 也可以。

3.7. 查看提交历史

  • 每行显示一个提交
git log --oneline
  • 以 ASCII 图表形式显示历史
git log --graph --oneline
  • 显示前2个
git log -2
  • 显示前2个简要统计信息
git log --stat -2
  • 显示前2个详细差异
git log -p -2

4. 忽略文件

很多时候,你并不希望某一类文件被 Git 自动添加,甚至不想这些文件被显示在未跟踪的文件列表下面。这些文件一般是自动生成的文件(比如日志文件)或是由构建系统创建的文件(比如.class文件)。在这种情况下,可以创建名为 .gitignore 的文件,在其中列出待匹配文件的模式。

  • 空行或者以 # 开始的行会被忽略
  • 支持标准的 glob 模式
  • 以斜杠(/)开头的模式可用于禁止递归匹配
  • 以斜杠(/)结尾的模式表示目录
  • 以感叹号(!)开始的模式表示取反

示例:

/node_modules/
/build/
.DS_Store
npm-debug.log*

5. 撤销操作

5.1. 刚才的commit漏了一个文件

git commit --amend

5.2. 刚才失误暂存了,想取消

git reset HEAD

5.3. 刚才失误修改了,想回滚

git checkout -- index.css

6. 远程仓库的使用

远程仓库是指在互联网或其他网络上托管的项目版本仓库。要同别人协作,就要管理这些远程仓库,在需要分享工作成果时,向其推送(push)数据,从中拉取(pull)数据。

6.1. 显示远程仓库

git remote // 列出每个远程仓库的简短名称
git remote -v  // 列出每个远程仓库对应的 url

6.2. 查看远程仓库详细信息

git remote show [remote-name]

6.3. 添加远程仓库

git remote add [shortname] [url]

6.4. 修改远程仓库地址

比如:远程仓库迁移了

git remote set-url <name> <newurl>

6.5. 删除远程仓库

git remote remove <name>

6.6. 从远程仓库拉取

git pull [remote-name]

6.7. 推送到远程仓库

git push [remote-name] [branch-name]

7. 分支操作

分支意味着偏离开发主线并继续你自己的工作而不影响主线开发。

7.1. 创建新分支

Git 的分支,其实本质上仅仅是指向提交对象的可变指针。Git 的默认分支名字是 master。通过 git branch 命令即可创建一个可以移动的新的指针。

git branch testing

原理:

实践:

7.2. 当前分支

Git 使用一个名为 HEAD 的特殊指针,指向当前所在的本地分支。

原理:

7.3. 切换分支

要切换到一个已存在的分支,你需要使用 git checkout 命令。

git checkout testing

原理:

实践:

7.3. 删除分支

git branch -d testing

实践:

7.4. 分支合并——快进合并

当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”

原理:

实践:

7.5. 分支合并——基本合并

因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并。

原理:

实践:

7.6. 分支合并——冲突处置

有时候合并操作不会如此顺利。如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。

实践:

7.7. 变基

Git 的变基(rebase)命令会把某个分支上所有提交的更改在另一个分支上重现一遍。

它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。

实践:

现在可以回到 master 分支进行快进合并了。

然后删除试验分支:

请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

变基总的原则是,只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行变基操作。

8. 远程分支

远程引用是对远程仓库的引用(指针),包括分支、标签等等。

  • 远程跟踪分支是远程分支状态的引用。它们是你无法移动的本地引用。
  • 远程分支的表现形式为 (remote)/(branch)。
    • git clone 命令会自动把远程仓库命名为 origin。
      • 并拉取它的全部数据,然后会在本地创建指向服务器上 master 分支的指针,并命名为 origin/master。
      • git 也会帮着你创建你自己本地 master 分支,这个分支一开始会与 origin 上的 master 分支指向同一个位置。

8.1. 创建跟踪分支

从一个远程跟踪分支检出一个本地分支会自动创建所谓的“跟踪分支”(它跟踪的分支叫做“上游分支”)。跟踪分支是与远程分支有直接关系的本地分支。如果在一个跟踪分支上输入 git pull,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。

git checkout --track origin/serverfix
  git checkout serverfix // 简化版写法,太常用了
    git checkout -b sf origin/serverfix // 用不同的名字创建远程分支
      git branch -u origin/serverfix // 设置远程分支

8.2. 拉取

git fetch

8.3. 推送

git push (remote) (branch)
  git push origin serverfix
    git push origin serverfix:awesomebranch 

8.4. 删除远程分支

git push origin --delte serverfix

参考资料:

《精通Git 第二版》 https://git-scm.com/book/en/v2