From 11b6af914cc7ac92e053e8153aa2a7790898a03e Mon Sep 17 00:00:00 2001 From: 7Wate Date: Wed, 28 Sep 2022 16:56:01 +0800 Subject: [PATCH] =?UTF-8?q?Git=EF=BC=9A=E5=8F=82=E8=80=83=E6=89=8B?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wiki/dev/Git/进阶/参考手册.md | 292 ++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) diff --git a/wiki/dev/Git/进阶/参考手册.md b/wiki/dev/Git/进阶/参考手册.md index e89b783d..49b329ec 100644 --- a/wiki/dev/Git/进阶/参考手册.md +++ b/wiki/dev/Git/进阶/参考手册.md @@ -10,3 +10,295 @@ sidebar_position: 5 author: 7Wate date: 2022-09-13 --- + +## 创建与克隆 + +首先得有一个 Git 仓库才能用它进行操作,仓库是 Git 存放你要保存的快照的数据的地方。拥有一个 Git 仓库的途径有两种: + +- 初始化一个新的 Git 仓库。 +- 克隆一个存在的项目。 + +### git init + +在命令行当前目录中执行 git init,就可以将当前目录初始化为 Git 仓库。 + +```shell +~/gitStudy# ls -l +total 0 +~/gitStudy# git init +Initialized empty Git repository in /root/gitStudy/.git/ +# 在 /root/gitStudy/.git/ 目录初始化空 Git 仓库完毕。 +~/gitStudy# ls -a +. .. .git +~/gitStudy# +``` + +### git clone + +如果需要克隆一个存在的项目。 在命令行当前目录中执行 git clone [url],url 为项目地址,然后就可以了。 + +```shell +$ git clone git://github.com/schacon/simplegit.git +Initialized empty Git repository in /private/tmp/simplegit/.git/ +remote: Counting objects: 100, done. +remote: Compressing objects: 100% (86/86), done. +remote: Total 100 (delta 35), reused 0 (delta 0) +Receiving objects: 100% (100/100), 9.51 KiB, done. +Resolving deltas: 100% (35/35), done. +$ cd simplegit/ +$ ls +README Rakefile lib +``` + +## 基本的快照 + +Git 的工作就是创建和保存项目的快照,及与之后的快照进行对比。 + +简而言之,使用 git add 添加需要追踪的新文件和待提交的更改, 然后使用 git status 和 git diff 查看有何改动, 最后用 git commit 将你的快照记录。绝大部分时候的基本流程都是这样的。 + +### git add + +在 Git 中提交修改文件之前,需要将它们添加到缓存。 + +```shell +# 添加 helloworld.cpp 至缓存区 +$ git add helloworld.cpp +# 添加当前目录至缓存区 +$ git add . +``` + +### git status + +在 Git 中执行 git status 命令,查看代码在缓存与当前工作目录的状态。 + +```shell +# 简短输出 +$ git status -s +# 详细输出 +$ git status +``` + +### git diff + +在 Git 中使用 git diff 描述已临时提交的或者已修改但尚未提交的改动。 + +```shell +# 尚未缓存的改动 +$ git diff +# 查看已缓存的改动 +$ git diff --cached +# 查看已缓存的与未缓存的所有改动 +$ git diff HEAD +# 显示摘要而非整个 diff +$ git diff --stat +``` + +### git commit + +在 Git 中使用 git add 将内容写入缓存,然后执行 git commit 就将它实际存储快照了。 + +```shell +# 配置提交信息 +$ git config --global user.name 'Your Name' +$ git config --global user.email you@somedomain.com +# 添加至缓存 +$ git add hello.rb +# 输出状态摘要 +$ git status -s +M hello.rb +# 提交快照 +$ git commit -m 'my hola mundo changes' +[master 68aa034] my hola mundo changes + 1 files changed, 2 insertions(+), 1 deletions(-) +``` + +如果执行 git commit 不适用 -m 选项,Git 则会尝试打开一个编辑器以填写提交信息。如果认为使用 git add 提交的流程太过繁琐,Git 允许使用 -a 选项跳过这一步。 + +```shell +$ vim hello.rb +$ git status -s + M hello.rb +$ git commit -m 'changes to hello file' +# On branch master +# Changed but not updated: +# (use "git add ..." to update what will be committed) +# (use "git checkout -- ..." to discard changes in working directory) +# +# modified: hello.rb +# +no changes added to commit (use "git add" and/or "git commit -a") +$ git commit -am 'changes to hello file' +[master 78b2670] changes to hello file + 1 files changed, 2 insertions(+), 1 deletions(-) +``` + +### git reset HEAD + +git reset 命令用于回退版本,可以指定退回某一次提交的版本。 + +```shell +git reset HEAD^ +``` + +### git rm + +通过执行 git rm 来删除 Git 追踪的文件,它还会删除你的工作目录中的相应文件。 + +## 分支与合并 + +几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。Git 的分支模型称为**必杀技特性**,而正是因为它,将 Git 从版本控制系统家族里区分出来。 + +### git branch + +在 Git 中列出、创建与管理工作上下文。 + +```shell +# 列出可用的分支 +$ git branch +# 创建新分支 +$ git branch (branchname) +# 删除分支 +$ git branch -d (branchname) +``` + +### git switch + +在 Git 中切换至指定分支。 + +```shell +git switch master +``` + +### git checkout + +在 Git 中 git checkout 创建新分支,并立即切换到它 + +```shell +git checkout -b (branchname) +``` + +### git merge + +一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用 `git merge` 命令将任何分支合并到当前分支中去。 + +```shell +$ git branch +* master + removals +$ ls +README hello.rb more.txt test.txt +$ git merge removals +Updating 8bd6d8b..8f7c949 +Fast-forward + more.txt | 1 - + test.txt | 1 - + 2 files changed, 0 insertions(+), 2 deletions(-) + delete mode 100644 more.txt + delete mode 100644 test.txt +$ ls +README hello.rb +``` + +### git log + +在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。 + +```shell +$ git log +commit 8d585ea6faf99facd39b55d6f6a3b3f481ad0d3d +Merge: 3cbb6aa 3ac015d +Author: Scott Chacon +Date: Fri Jun 4 12:59:47 2010 +0200 + + Merge branch 'fix_readme' + + Conflicts: + README + +commit 3cbb6aae5c0cbd711c098e113ae436801371c95e +Author: Scott Chacon +Date: Fri Jun 4 12:58:53 2010 +0200 + + fixed readme title differently + +... +``` + +### git tag + +如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 `git tag` 给它打上标签。 + +```shell +$ git tag -a v1.0 +# 指定提交打标签 +$ git tag -a v0.9 558151a +# 指定标签信息命令 +$ git tag -a -m "runoob.com标签" +# PGP签名标签命令 +$ git tag -s -m "runoob.com标签" +``` + +## 共享与更新 + +Git 并不像 Subversion 那样有个中心服务器。 目前为止所有的命令都是本地执行的,更新的知识本地的数据库。简而言之使用 git fetch 更新你的项目,使用 git push 分享你的改动。 你可以用 git remote 管理你的远程仓库。 + +### git remote + +在 Git 中 git remote 命令管理远端仓库列表。 + +```shell +# 列出远端别名 +$ git remote +# 为项目添加一个新的远端仓库 +$ git remote add +# 删除现存的某个别名 +$ git remote rm +``` + +### git fetch + +在 Git 中 git fetch 从远端仓库**下载新分支与数据**。 + +```shell +git fetch +``` + +### git pull + +在 Git 中 git pull 从远端仓库提取数据并**尝试合并到当前分支**。该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 + +```shell +git fetch +``` + +### git push + +在 Git 中 git push remote-name branch-name 将本地改动推送到远端仓库。 如果可以的话,它会依据你的 branch 的样子,推送到远端的 branch 去。 + +```shell +git push github master +``` + +## 检查与比较 + +### git log + +在 Git 中执行 git log 找到你的项目历史中的特定提交 —— 按作者、日期、内容或者历史记录。 + +```shell +# 特定作者 Linus 的提交 +$ git log --author=Linus +# 指定日期的提交 +$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges +# 根据提交注释过滤提交记录 +$ git log --grep=P4EDITOR --no-merges +``` + +### git diff + +在 Git 中执行 git diff 比较历史记录中的两个不同的点 —— 通常是为了看看两个分支有啥区别,或者从某个版本到另一个版本,你的软件都有啥变化。 + +```shell +# 查看 v0.9 标签后差异 +$ git diff v0.9 +```