跳到主要内容

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 "你的邮箱"

配置代理前,先确认代理软件实际的 HTTP / mixed 或 SOCKS 端口。Git 的 HTTP 和 HTTPS 传输都使用 http.proxy 配置,不需要另设 https.proxy。

下面先演示只影响一次 Git 命令的 HTTP 代理;地址和端口按实际配置替换:

git -c http.proxy=http://127.0.0.1:7890 ls-remote https://github.com/git/git.git HEAD

需要让目标仓库持续使用该代理时,在仓库目录内设置:

git config --local http.proxy http://127.0.0.1:7890
git config --show-origin --get-all http.proxy

只有明确要影响当前用户的所有仓库时,才改用 --global。SOCKS 入口可以使用 socks5h://127.0.0.1:10808,前提是该端口确实提供 SOCKS 服务;socks5h 让支持它的工具把域名交给代理解析。不要同时把同一个端口假设为 HTTP 和 SOCKS。

修改前记录原值;恢复时还原原值。如果原来没有该配置,才移除本次在对应作用域添加的键,例如:

git config --local --unset http.proxy

环境变量是另一种方式,不同 shell 的写法不同。

Bash / Zsh 当前终端:

export http_proxy="http://127.0.0.1:7890"
export https_proxy="$http_proxy"

PowerShell 当前终端:

$env:http_proxy = "http://127.0.0.1:7890"
$env:https_proxy = $env:http_proxy

这些变量只影响采用它们的当前终端及子进程,不等于已写入 Git 配置。已有 http.proxy 还可能覆盖环境设置,排查时先看配置来源。git@github.com:... 这类 SSH 仓库地址需要单独配置 SSH 连接,不采用这里的 HTTP 代理设置。

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 restore --worktree -- test.txt

该命令丢弃 test.txt 的未暂存修改,默认从暂存区恢复,并不一定等于最后一次提交。若明确要从当前提交恢复这一个文件,可使用 git restore --source=HEAD --worktree -- test.txt;执行前先查看差异并保留需要的修改。单独运行 git checkout 不能作为“还原全部文件”的命令。

版本回退

使用 git reset 回退版本

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

常用选项:

  • --soft:仅移动 HEAD,不影响暂存区和工作区。回退后的所有更改都保留在暂存区中。(HEAD为当前版本)
  • --mixed(默认选项):移动 HEAD,并重置暂存区,但保留工作区的更改。回退后的更改仍在工作区,但不在暂存区。
  • --hard:移动 HEAD,同时重置暂存区和工作区。会覆盖受影响的已跟踪工作区和暂存区内容,也可能覆盖妨碍写入的未跟踪文件。未提交内容可能无法恢复;已有提交仍可能通过 reflog 找回。

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

  • 软回退:
    git reset --soft abc123
    这将把当前分支指针(HEAD)移到 abc123,但保持工作区和暂存区的所有更改。
  • 混合回退:
    git reset --mixed abc123
    这将回退到 abc123,并将暂存区重置为该提交的状态,但保留工作区的更改。
  • 硬回退:
    git reset --hard abc123
    这会移动当前分支并把暂存区、工作区重置到目标提交。它不是删除所有后续提交对象;已提交历史可能通过 reflog 找回,但未提交内容没有这种保证。先核对目标、差异并保留需要的修改,再决定是否硬回退。
使用 git revert 进行安全回退

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

假设你想撤销提交 abc123。

git revert abc123

这会尝试用一个新提交撤销 abc123 引入的改动,保留既有历史。它可能与后续修改冲突,也可能改变后续代码依赖的行为;不能保证对其他提交的效果完全没有影响。

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

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

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

git checkout abc123

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

git checkout master

(假设你在 master 分支上)

如何找到提交的哈希值

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

git log
git log --pretty=oneline # 每个提交显示为一行

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

删除文件

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 checkout 或 git switch 来切换到其他分支。在 Git 2.23 之后,Git 引入了 git switch,它专门用于切换分支,更加直观和安全。

git checkout feature/new-feature

或者使用:

git switch feature/new-feature

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

3. 创建并切换到新分支

可以使用 git checkout -b 或 git 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. 合并分支

当你完成了在某个分支上的工作并希望将其合并回主分支(例如 master 或 develop),你可以使用 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 fetch 或 git 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 pop 和 git stash apply

3.1 git stash pop
git stash pop

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

3.2 git stash apply
git stash apply

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

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 !
赏
评论

评论将在接近此处时加载,也可点击立即加载。

  目录