git

git init

工作区 暂存区 版本库
工作区(Working Directory):

  • 就是你在电脑里能看到的目录,即当前项目目录
  • 是我们直接编辑文件的地方

暂存区(Stage/Index):

  • 是一个临时存储区域
  • 用于存放已经通过git add命令添加的文件修改内容
  • 是准备提交到版本库的文件修改内容

版本库(Repository):

  • 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库
  • 版本库中存储了很多东西,其中最重要的就是stage(暂存区)
  • 还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
  • 通过git commit命令将暂存区的内容提交到当前分支

git add 将文件添加到暂存区 git ls-files 查看暂存区中的文件

实际开发常用命令流程

一、项目初始化流程

# 克隆远程仓库
git clone <仓库地>
git clone <仓库地> <目录>           # 克隆到指定目录
git clone -b <分支> <仓库地>       # 克隆指定分支
 
# 或在现有目录初始化
git init
git remote add origin <仓库地>       # 添加远程仓库
git pull origin main                   # 拉取远程代码
 
# 首次推送并关联远程分支
git push -u origin main

二、日常开发流程

# 1. 开始工作前,先拉取最新代码
git pull origin main
# 或更安全的做法(推荐)
git fetch origin
git merge origin/main
 
# 2. 创建新分支进行开发
git checkout -b feature/login
# 或使用新命令
git switch -c feature/login
 
# 3. 查看当前状态
git status
git status -s                         # 简洁模式
 
# 4. 添加文件到暂存区
git add <文件>                      # 添加单个文件
git add .                             # 添加所有修改
git add -A                            # 添加所有文件(包括删除)
git add -u                            # 只添加已跟踪文件的修改
git add *.java                        # 添加所有 .java 文件
 
# 5. 提交更改
git commit -m "feat: 添加登录功能"
git commit -am "fix: 修复登录bug"     # 跳过暂存区,直接提交已跟踪文件
 
# 6. 推送到远程
git push origin feature/login

三、分支管理流程

# 查看分支
git branch                            # 查看本地分支
git branch -a                         # 查看所有分支(含远程)
git branch -r                         # 只查看远程分支
git branch -vv                         # 查看分支详细信息及关联的远程分支
 
# 创建分支
git branch <分支>                   # 创建但不切换
git checkout -b <分支>              # 创建并切换
git switch -c <分支>                # 创建并切换(推荐)
 
# 切换分支
git checkout <分支>
git switch <分支>                   # 推荐
 
# 合并分支
git checkout main                     # 先切换到目标分支
git merge feature/login               # 合并 feature/login 到 main
git merge --no-ff feature/login       # 禁用快进合并,保留分支历史
 
# 删除分支
git branch -d <分支>                # 删除已合并的分支
git branch -D <分支>               # 强制删除分支
 
# 重命名分支
git branch -m <> <>           # 重命名分支
git branch -m <>                  # 重命名当前分支
 
# 推送本地分支到远程
git push -u origin <分支>           # 首次推送并关联
git push origin --delete <分支>     # 删除远程分支

四、代码回退与撤销

# 撤销工作区修改(未 add)
git checkout -- <文件>
git restore <文件>                  # Git 2.23+ 推荐
 
# 撤销暂存区修改(已 add,未 commit)
git reset HEAD <文件>
git restore --staged <文件>         # Git 2.23+ 推荐
 
# 撤销最近一次提交(保留修改)
git reset --soft HEAD~1               # 撤销 commit,保留暂存区和工作区
git reset --mixed HEAD~1              # 撤销 commit 和 add,保留工作区(默认)
git reset --hard HEAD~1               # 撤销 commit 和 add,删除工作区修改(危险!)
 
# 修改最近一次提交信息
git commit --amend -m "新的提交信息"
git commit --amend                    # 打开编辑器修改
 
# 撤销已推送的提交(公共分支慎用)
git revert <commit-hash>              # 创建新提交来撤销指定提交
git revert HEAD                       # 撤销最近一次提交

五、远程协作流程

# 查看远程仓库
git remote -v
git remote show origin                # 查看远程仓库详细信息
 
# 添加/删除远程仓库
git remote add origin <仓库地>
git remote remove <远程>
git remote rename <> <>
 
# 修改远程仓库地址
git remote set-url origin <新地>
 
# 拉取远程更新
git fetch origin                      # 只拉取,不合并
git fetch --all                       # 拉取所有远程仓库
git pull origin main                  # 拉取并合并
git pull --rebase origin main         # 拉取并变基(保持线性历史)
 
# 推送代码
git push origin <分支>
git push -f origin <分支>           # 强制推送(危险!)
git push --all origin                 # 推送所有分支
 
# 同步远程已删除的分支
git fetch -p                          # 或 git remote prune origin

六、暂存工作(Stash)

# 当需要临时切换分支但不想提交当前修改时使用
git stash                             # 暂存当前修改
git stash save "描述信息"             # 暂存并添加描述
git stash -u                          # 暂存包括未跟踪的文件
 
# 查看暂存列表
git stash list
 
# 恢复暂存
git stash pop                         # 恢复最近一次暂存并删除记录
git stash pop stash@{1}               # 恢复指定的暂存
git stash apply                       # 恢复但不删除记录
git stash apply stash@{1}
 
# 删除暂存
git stash drop stash@{1}              # 删除指定暂存
git stash clear                       # 删除所有暂存
 
# 查看暂存内容
git stash show                        # 查看暂存概要
git stash show -p                     # 查看暂存详细差异

七、冲突解决

# 合并冲突时
git merge feature/login
# 发生冲突后,手动编辑冲突文件,然后:
git add <冲突文>
git commit -m "merge: 解决合并冲突"
 
# 放弃合并
git merge --abort
 
# 变基冲突时
git rebase main
# 解决冲突后:
git add <冲突文>
git rebase --continue                 # 继续变基
git rebase --abort                    # 放弃变基
 
# 查看冲突文件
git diff --name-only --diff-filter=U

八、查看信息

# 查看提交历史
git log
git log --oneline                     # 单行显示
git log -n 5                          # 最近5条
git log --graph                       # 图形化显示
git log --oneline --graph --all       # 组合使用
git log --author="张三"               # 按作者筛选
git log --since="2024-01-01"          # 按时间筛选
git log -p <文件>                   # 查看某文件的修改历史
 
# 查看差异
git diff                              # 工作区 vs 暂存区
git diff --staged                     # 暂存区 vs 最新提交
git diff HEAD                         # 工作区 vs 最新提交
git diff <分支1> <分支2>              # 比较两个分支
git diff <commit1> <commit2>          # 比较两个提交
 
# 查看文件内容
git show <commit-hash>                # 查看某次提交的内容
git show <commit-hash>:<文件路>     # 查看某次提交中某文件的内容
 
# 查看文件修改历史
git blame <文件>                    # 显示每行的修改者和时间
 
# 查看操作记录
git reflog                            # 查看所有操作记录,可用于恢复误删

九、实用技巧

# 选择性合并某次提交
git cherry-pick <commit-hash>
 
# 清理未跟踪的文件
git clean -n                          # 预览要删除的文件
git clean -f                          # 删除未跟踪的文件
git clean -fd                         # 删除未跟踪的文件和目录
 
# 二分查找定位问题
git bisect start
git bisect bad                        # 当前版本有问题
git bisect good <commit-hash>         # 这个版本没问题
# Git 会自动定位到引入问题的提交
 
# 查看某行代码的修改历史
git log -L 10,20:file.txt             # 查看文件第10-20行的修改历史
 
# 只克隆最近一次提交(节省空间和时间)
git clone --depth 1 <仓库地>
 
# 更新子模块
git submodule update --init --recursive

十、提交信息规范(约定式提交)

# 常用提交类型
feat:     新功能
fix:      修复 bug
docs:     文档更新
style:    代码格式(不影响功能)
refactor: 重构(不是新功能也不是修复 bug)
test:     添加测试
chore:    构建过程或辅助工具的变动
 
# 示例
git commit -m "feat: 添加用户登录功能"
git commit -m "fix: 修复登录页面样式问题"
git commit -m "docs: 更新 README 文档"
git commit -m "refactor: 重构用户模块代码结构"

git rm filename 把文件从工作区和暂存区同时删除 git rm --cached filename 把文件从暂存区删除,但保留在当前工作区中 git rm -r * 递归删除某个目录下的所有子目录和文件 删除后不要忘记提交

git commit

git commit -m "xxx" 提交说明 git commit --amend 修改先前的提交

git reset

选项作用
—soft保留工作区和暂存区
—hard删除工作区和暂存区
—mixed保留工作区,删除暂存区

git diff

一般用图形化工具

git diff 命令

git push

git push <远程仓库名> <本地分支名>:<远程分支名> 用于将本地分支的更新推送到远程仓库。 如果本地分支名和远程分支名相同,可以省略 :<远程分支名> 部分。例如 git push origin maingit push -u <远程仓库名> <本地分支名> 首次推送时使用,-u 选项会将本地分支和远程分支关联起来,之后使用 git push 就可以直接推送。

git pull

git pull <远程仓库名> <远程分支名> 用于从远程仓库拉取指定分支的更新,并尝试自动合并到当前本地分支。它实际上是 git fetchgit merge 的组合。如果本地分支已经和远程分支关联,可直接使用 git pull

git status

git status 用于查看工作区、暂存区的状态。它会显示哪些文件被修改但未暂存,哪些文件已暂存但未提交等信息。
git status -s 可以以简洁模式显示状态信息。

git log

git log 用于查看提交历史记录。 git log --oneline 可以将每条提交记录显示在一行,使输出更简洁。 git log -n <数量> 可以只显示最近的 <数量> 条提交记录。 git log --graph 可以以图形化的方式显示提交历史,便于查看分支合并情况。

git merge

git merge <分支名> 用于将指定分支的修改合并到当前分支。

合并有两种常见情况:快进合并(Fast-forward)和三方合并(Three-way merge)。如果合并过程中出现冲突,需要手动解决冲突后再提交。git merge --abort 可以在合并冲突时放弃合并操作,回到合并前的状态。

git merge feature 将 feature 分支合并到当前分支

git rebase

将一个分支的提交历史“重新定位”到另一个分支的最新提交上,从而形成线性的提交历史。

git checkout

git checkout -b <新分支名> 用于创建并切换到一个新的分支。 例如,git checkout -b feature 会创建一个名为 feature 的新分支,并立即切换到该分支。

git checkout <分支名> 用于切换到已有的分支。例如,git checkout main 会切换到 main 分支。

git checkout <提交哈希值> 用于切换到指定的提交,此时会处于“分离头指针”状态。在这种状态下的修改不会影响任何分支,除非创建新分支来保存这些修改。

git switch

git switch -c <新分支名> 功能与 git checkout -b 类似,用于创建并切换到一个新的分支。 例如,git switch -c bugfix 会创建一个名为 bugfix 的新分支,并切换到该分支。

git switch <分支名> 用于切换到已有的分支,与 git checkout <分支名> 功能相同。 例如,git switch develop 会切换到 develop 分支。

git switch 是 Git 2.23 版本引入的新命令,旨在提供更清晰的分支切换操作,与 git checkout 相比,git switch 更专注于分支切换,而 git checkout 还可用于恢复文件等操作。

git branch

git branch 用于列出本地所有分支,当前所在分支会用 * 标记。

git branch <新分支名> 用于创建一个新的分支,但不会切换到该分支。例如,git branch experimental 会创建一个名为 experimental 的新分支。

git branch -d <分支名> 用于删除已经合并到当前分支的指定分支。如果分支还有未合并的更改,使用该命令会失败,可使用 git branch -D <分支名> 强制删除。

git branch -m <旧分支名> <新分支名> 用于重命名本地分支。例如,git branch -m old-name new-name 会将 old-name 分支重命名为 new-name

git clone -b barnch-name 克隆指定分支

git remote

git remote -v   查看git远程仓库地址
git remote set-url origin 新地址    替换成新地址

tag 打标签

git tag v1.0

git tag v1.0
 
git tag v0.9   commitId
 
 
git tag -d v0.9
 
 
git push origin --tags #推送标签

git fetch --all --tags 获取远程仓库所有标签 how to check out git tags

config

  • 免密拉取 git config --global credential.helper store
  • 关闭ca认证 sudo git config --system http.sslverify false
  • git config --global http.sslverify false
git config --local --list
git config --local user.name dukechase
git config --local user.email  hsb2435@163.com

Git 多用户配置

各部分含义

  1. Host gitee
    • 定义了一个别名 gitee,表示你可以通过这个别名来简化对 Gitee 的连接。
    • 当你在命令行中使用 ssh gitee 或与 Gitee 相关的 Git 操作时,SSH 客户端会根据这个别名查找对应的配置。
  2. HostName gitee.com
    • 指定了实际的目标主机地址,这里是 gitee.com
    • 当你使用别名 gitee 时,SSH 客户端会将它解析为 gitee.com
  3. Port 22
    • 指定了连接到目标主机时使用的端口号,默认情况下,SSH 使用的是 22 端口。
    • 如果 Gitee 使用非标准端口,则可以在这里修改为其他值。
  4. IdentityFile ~/.ssh/gitee_id_rsa
    • 指定了用于身份验证的私钥文件路径。
    • 在这里,~/.ssh/gitee_id_rsa 是一个私钥文件,SSH 客户端会用它来验证你的身份,以便成功连接到 Gitee。
Host github
HostName github.com
IdentityFile ~/.ssh/id_rsa_github
 
Host gitlab
HostName gitlab.mygitlab.com
IdentityFile ~/.ssh/id_rsa_gitlab

测试连接

ssh -T git@github
Hi jitwxs! You've successfully authenticated, but GitHub does not provide shell access.
ssh -T git@gitlab
Welcome to GitLab, @lemon!

gitignore

.gitignore 文件用于指定 Git 应该忽略的文件和目录,即这些文件不会被纳入版本控制。

以下是 .gitignore 文件的常见规则:

1. 基本语法

  • 忽略文件:直接写上文件名,每行一个。例如:
temp.txt

这会忽略项目根目录下的 temp.txt 文件。

  • 忽略目录:在目录名后加斜杠 /。例如:
logs/

这会忽略项目根目录下的 logs 目录及其所有内容。

2. 通配符使用

  • *:匹配任意数量的任意字符。例如:
*.log

这会忽略所有扩展名为 .log 的文件。

  • ?:匹配单个任意字符。例如:
file?.txt

这会忽略 file1.txtfileA.txt 等文件。

  • [abc]:匹配方括号内的任意一个字符。例如:
file[123].txt

这会忽略 file1.txtfile2.txtfile3.txt

3. 递归匹配

如果没有指定路径,规则会递归应用到整个项目。例如:

*.tmp

这会忽略项目中所有扩展名为 .tmp 的文件,无论它们在哪个目录下。

4. 否定规则

在规则前加 ! 可以取消之前的忽略规则。例如:

*.log
!important.log

这会忽略所有 .log 文件,但 important.log 文件除外。

5. 注释

# 开头的行是注释,会被 Git 忽略。例如:

# 忽略临时文件
*.tmp

6. 路径匹配

可以使用相对路径指定要忽略的文件或目录。例如:

src/test/results/

这会忽略 src/test/results 目录及其所有内容。