git使用


git使用

1. 安装 Git

Windows

  1. Git 官方网站 下载 Git 安装程序。
  2. 双击安装程序并按照提示完成安装。

Linux

  1. 使用包管理器安装 Git(以 Ubuntu 为例):

    sudo apt update
    sudo apt install git

2. 配置 Git

安装完成后,配置用户名和邮箱:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"

3. 创建 SSH Key

如果需要使用 SSH 方式连接 GitHub,生成 SSH key 并添加到 GitHub。

生成 SSH Key

ssh-keygen -t rsa -C "你的邮箱"

按提示操作,默认保存位置即可。生成完成后,使用以下命令查看公钥:

cat ~/.ssh/id_rsa.pub

添加 SSH Key 到 GitHub

  1. 登录 GitHub,进入 SSH and GPG keys 页面。
  2. 点击 “New SSH key”,粘贴上一步生成的公钥内容,点击 “Add SSH key”。

4. 创建 Git 仓库

本地仓库

  1. 创建一个新的目录并进入:

    mkdir my_project
    cd my_project
  2. 初始化 Git 仓库:

    git init

远程仓库

  1. 登录 GitHub,点击右上角 “+”,选择 “New repository”。

  2. 填写仓库名和描述,点击 “Create repository”。

  3. .gitignore 文件用于告诉 Git 哪些文件或目录不应该被添加到版本控制中。它在 Git 项目中非常重要,特别是当你的项目包含一些不需要共享的文件,如编译后的二进制文件、临时文件、或包含敏感信息的配置文件。

    .gitignore 文件通常放在项目的根目录下,但你也可以在子目录中添加 .gitignore 文件,作用范围仅限于该目录及其子目录。

    .gitignore 文件的语法

    • 忽略特定文件或目录:在 .gitignore 中直接写上文件名或目录名。

      # 忽略文件
      secret.txt
      
      # 忽略目录
      /logs/
    • 通配符:使用 * 代表任意字符,? 代表单个字符,[abc] 代表匹配集合中的任意一个字符。

      # 忽略所有 .log 文件
      *.log
      
      # 忽略以 "temp" 开头的文件
      temp*
      
      # 忽略名为 "backup" 或 "bak" 的文件
      *.[bB][aA][kK]
    • 排除规则:以 ! 开头的行用于排除某些文件或目录,这些文件即使符合前面的忽略规则也不会被忽略。

      # 忽略所有 .log 文件,但不忽略 important.log
      *.log
      !important.log
    • 指定路径:使用斜杠 / 来表示目录路径。以斜杠开头表示从根目录开始匹配。

      # 只忽略根目录下的 "config.json",不忽略其他目录中的 "config.json"
      /config.json

5. 关联本地仓库与远程仓库

在本地仓库中,执行以下命令:

git remote add origin git@github.com:你的用户名/仓库名.git

git remote add 是一个 Git 命令,用于向你的本地仓库添加一个远程仓库。一个远程仓库是一个托管在某个服务器上的 Git 仓库,你可以将本地的更改推送到远程仓库,也可以从远程仓库拉取更新。

origin 是这个远程仓库的名字。你可以把它理解为远程仓库的一个别名,便于你以后引用这个远程仓库。在大多数情况下,origin 是默认的名字,用于指向你克隆的或第一次关联的远程仓库。

通过执行这条命令,你告诉 Git:**这个本地仓库的远程仓库是位于 GitHub 上的 git@github.com:你的用户名/仓库名.git 这个位置,并且将它命名为 origin**。

之后,你可以使用类似 git push origin master 的命令将本地的代码推送到 GitHub 上的远程仓库,或者使用 git pull origin master 从 GitHub 上拉取更新。

6. 基本 Git 操作

添加文件并提交

提交前的工作目录是工作区(文件操作的区域)

添加文件到暂存区:

git add 文件名

这条命令用于将指定的文件添加到 Git 的暂存区(Stage)。暂存区是一个临时区域,你可以在其中暂时存放那些你准备提交到仓库的更改。文件在添加到暂存区之前,可以进行修改,而这些修改不会立即提交到仓库中。

或添加所有文件:

git add .

提交到本地仓库:

git commit -m "提交信息"

这条命令用于将暂存区中的所有内容提交到本地 Git 仓库,并为此次提交添加一条消息。-m "提交信息" 选项允许你在命令行中直接输入一条提交信息,而不需要进入编辑器。

查看暂存区的文件

git status 命令会显示工作区和暂存区的状态,包括哪些文件被修改但尚未添加到暂存区,以及哪些文件已经被添加到暂存区。

git status

输出中,暂存区中的文件会显示在 Changes to be committed 部分。例如:

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   index.html
        new file:   style.css

这意味着 index.html 文件已被修改并添加到暂存区,而 style.css 是一个新文件,也已经被添加到暂存区。

使用 git diff --cached 查看暂存区的更改

git diff --cached 命令会显示暂存区中的更改细节。这个命令的输出与 git diff 类似,但只显示暂存区中的内容,而不包括工作区中尚未添加到暂存区的修改。

git diff --cached

或者你也可以使用 git diff --staged,效果是一样的。

这个命令将显示具体的代码差异,即哪些行被修改、添加或删除。例如:

diff --git a/index.html b/index.html
index 83b2d7e..e39a4ff 100644
--- a/index.html
+++ b/index.html
@@ -12,7 +12,7 @@
   <title>My Website</title>
 </head>
 <body>
-  <h1>Hello, World!</h1>
+  <h1>Welcome to My Website</h1>
 </body>
 </html>

从 Git 暂存区移除文件

使用 git restore --staged

用于将文件从暂存区移除,并恢复到工作区的状态。

git restore --staged 文件名
使用 git reset

用于回滚或取消更改。使用 git reset 也可以将文件从暂存区移除。

git reset 文件名
移除所有文件
git reset

这将把暂存区中的所有文件全部移除,同时保留它们在工作区中的修改。

恢复工作区文件

git checkout -- test.txt
git checkout # 直接还原为最新版本

是用于丢弃工作区中对 txt 文件的所有未提交更改的命令。具体来说,它将 txt 文件恢复到最后一次提交时的状态。

版本回退

使用 git reset 回退版本

git reset 用于回退到某个特定的提交,并且可以选择性地影响暂存区和工作区。

常用选项:

  • --soft:仅移动 HEAD,不影响暂存区和工作区。回退后的所有更改都保留在暂存区中。(HEAD为当前版本)
  • --mixed(默认选项):移动 HEAD,并重置暂存区,但保留工作区的更改。回退后的更改仍在工作区,但不在暂存区。
  • --hard:移动 HEAD,同时重置暂存区和工作区。回退后的所有更改都被删除,不可恢复。

假设你想回退到特定的提交 abc123

  • 软回退:

    git reset --soft abc123

    这将把当前分支指针(HEAD)移到 abc123,但保持工作区和暂存区的所有更改。

  • 混合回退:

    git reset --mixed abc123

    这将回退到 abc123,并将暂存区重置为该提交的状态,但保留工作区的更改。

  • 硬回退:

    git reset --hard abc123

    这将回退到 abc123,并删除所有在 abc123 之后的更改。这个操作不可逆,因此使用前请务必确认。

使用 git revert 进行安全回退

git revert 用于生成一个新的提交,该提交会撤销指定的历史提交,而不会改变项目的提交历史。git revert 是一种“安全”的回退方式,因为它保留了所有历史记录。

假设你想撤销提交 abc123

git revert abc123

这将生成一个新的提交,它的作用是撤销 abc123 所做的更改,而不会影响 abc123 之前或之后的其他提交。

使用 git checkout 回退到特定提交(仅查看)

git checkout 主要用于切换分支或查看特定提交。你可以暂时回退到某个提交,但不修改当前分支的状态。

假设你想查看 abc123 提交的状态。

git checkout abc123

这将把工作区和暂存区切换到 abc123 提交的状态,但不会更改当前分支的指针。如果你想回到最新的状态,可以使用:

git checkout master

(假设你在 master 分支上)

如何找到提交的哈希值

在执行版本回退前,你需要知道要回退到的提交的哈希值(类似 abc123)。可以使用以下命令查看提交历史:

git log
git log --pretty=oneline # 显示一行
git reset --hard HEAD^ # 回退上一个版本
git reset --hard HEAD^^ # 同理
git reset --hard HEAD~10

这将显示所有提交的日志,包括提交哈希、作者、日期和提交信息。

删除文件

git rm <file>git add<file>效果是一样的

推送到远程仓库

git push origin master
git remote -v #查看远程库信息
git remote rm origin # 删除关联

克隆远程仓库

git clone git@github.com:你的用户名/仓库名.git

拉取更新

git pull origin master

Git标签

给某个提交打标签(通常用于发布版本):

git tag -a v1.0 -m "版本1.0"

推送标签到远程仓库:

git push origin --tags

7. 分支管理

1. 创建分支

要创建一个新的分支,使用 git branch 命令。新分支会基于你当前所在的分支创建。

git branch feature/new-feature

这会创建一个名为 feature/new-feature 的新分支,但不会切换到该分支。

2. 切换分支

使用 git checkoutgit switch 来切换到其他分支。在 Git 2.23 之后,Git 引入了 git switch,它专门用于切换分支,更加直观和安全。

git checkout feature/new-feature

或者使用:

git switch feature/new-feature

这将切换到 feature/new-feature 分支,并更新工作区和暂存区以匹配该分支的状态。

3. 创建并切换到新分支

可以使用 git checkout -bgit switch -c 在创建新分支的同时切换到该分支。

git checkout -b feature/new-feature

或者使用:

git switch -c feature/new-feature

这将创建 feature/new-feature 分支并立即切换到该分支。

4. 查看分支

要查看所有分支,可以使用 git branch 命令。当前所在的分支会以 * 标记。

git branch

输出示例:

  develop
* feature/new-feature
  master

这表明你当前在 feature/new-feature 分支上。

5. 合并分支

当你完成了在某个分支上的工作并希望将其合并回主分支(例如 masterdevelop),你可以使用 git merge 命令。

合并分支的步骤:

  1. 切换到目标分支(通常是 master 或 develop):

    git checkout master
  2. 合并工作分支

    git merge feature/new-feature

    这将把 feature/new-feature分支的更改合并到 master分支中。如果没有冲突,Git 会自动完成合并。如果有冲突,需要手动解决后再完成合并。

6. 处理合并冲突

当 Git 无法自动合并两个分支时,会提示合并冲突。此时,需要手动编辑冲突的文件,解决冲突后再继续合并。

  1. 打开冲突文件,找到冲突标记:

    <<<<<<< HEAD
    当前分支的代码
    =======
    被合并分支的代码
    >>>>>>> feature/new-feature
  2. 手动解决冲突,编辑文件使其符合预期。

  3. 标记冲突为已解决并提交:

    git add 冲突文件
    git commit

7. 删除分支

当一个分支的工作完成且不再需要时,可以将其删除。

删除本地分支:

git branch -d feature/new-feature

如果分支尚未合并,Git 会阻止删除,以防丢失更改。要强制删除,可以使用 -D 选项:

git branch -D feature/new-feature

删除远程分支:

git push origin --delete feature/new-feature

这将删除远程仓库中的 feature/new-feature 分支。

8. 远程分支

远程分支是托管在远程仓库中的分支,例如 GitHub、GitLab 上的分支。通常,当你推送分支到远程仓库时,该分支会自动在远程仓库中创建。

查看远程分支:

git branch -r

这将列出所有远程分支。

推送本地分支到远程:

git push origin feature/new-feature

这会将 feature/new-feature 分支推送到远程仓库的 origin(默认远程名称)上。

9. 跟踪远程分支

你可以将本地分支与远程分支关联,使推送和拉取更方便。

创建跟踪分支:

git checkout -b feature/new-feature origin/feature/new-feature

或者,如果分支已经存在:

git branch --set-upstream-to=origin/feature/new-feature

10. 更新远程分支

要同步本地仓库与远程仓库的状态,使用 git fetchgit pull

拉取更新并合并:

git pull origin master

这将从远程 master 分支拉取最新的更改并合并到当前分支。

仅获取更新(不合并):

git fetch origin

这将更新本地的远程分支信息,但不合并更改。

8.存储进度

git stash 允许你将当前的工作进度(包括工作区和暂存区的更改)暂时存储起来,以便可以在一个干净的工作区中进行其他操作。之后,你可以随时恢复这些存储的更改。

1. 基本命令:git stash

1.1 存储当前工作区和暂存区的更改
git stash

这会将当前分支的工作区和暂存区的所有更改存储起来,工作区将恢复到最后一次提交时的状态。存储的更改会被放入一个“栈”中,供以后恢复使用。

1.2 存储时添加描述信息

你可以为存储的更改添加描述信息,以便更容易区分多个存储。

git stash save "描述信息"
2. 查看存储:git stash list
git stash list

这会列出所有的存储记录,每一条记录都有唯一的索引和描述信息。输出示例:

stash@{0}: WIP on master: 5d1e76a 修复首页布局
stash@{1}: WIP on master: 2a7b8d9 添加新功能

stash@{0} 是最顶部的存储记录,stash@{1} 是次存储记录,依此类推。

3. 恢复存储:git stash popgit stash apply

3.1 git stash pop
git stash pop

这会将最近存储的更改恢复到工作区和暂存区,并将该存储记录从列表中删除。如果有冲突,Git 会提示手动解决冲突。

3.2 git stash apply
git stash apply

这会将最近的存储恢复到工作区和暂存区,但不会删除该存储记录。如果你需要多次应用存储,使用 applypop 更合适。

3.3 恢复特定存储

如果有多个存储记录,你可以指定恢复某个特定的存储。

git stash apply stash@{1}

这会恢复索引为 stash@{1} 的存储,并保留存储记录。

9.常见的Git Hooks

  • pre-commit:在git commit命令执行之前触发。可以用来执行代码风格检查或静态分析,防止不合格的代码提交。
  • commit-msg:在提交信息编辑完成后触发。用于检查提交信息是否符合团队规范(如强制使用特定格式)。
  • post-commit:在提交完成后触发。可以用于执行通知或部署任务。

示例:自动检查代码风格

假设你使用pre-commit钩子来检查Python代码的风格是否符合PEP8标准。以下是一个简单的脚本:

#!/bin/sh
files=$(git diff --cached --name-only --diff-filter=ACM | grep '\.py$')
if [ -z "$files" ]; then
    exit 0
fi

unformatted=$(pycodestyle $files)
if [ ! -z "$unformatted" ]; then
    echo "Python代码风格检查失败:"
    echo "$unformatted"
    exit 1
fi

exit 0

将这个脚本保存为.git/hooks/pre-commit并赋予可执行权限:

chmod +x .git/hooks/pre-commit

文章作者: 0xdadream
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 0xdadream !
评论
  目录