【Linux命令大全】001.文件管理之git命令(实操篇)

【Linux命令大全】001.文件管理之git命令(实操篇)

✨ 本文为Linux系统git命令的全面讲解与实战指南,帮助您掌握这款强大的分布式版本控制系统,实现高效的代码管理、团队协作和项目跟踪。

(关注不迷路哈!!!)

文章目录


一、功能与作用

git是一个开源的分布式版本控制系统,由Linus Torvalds于2005年创建,用于高效地管理各种规模的软件项目。与集中式版本控制系统(如SVN)不同,Git的分布式特性使得每个开发者都拥有完整的代码库副本,从而实现离线工作、本地分支管理和高效的协作开发。

主要特点

  • 分布式架构,无中央单点故障
  • 高效的分支管理,支持快速创建和合并分支
  • 强大的历史记录和变更追踪能力
  • 支持非线性开发流程
  • 占用空间小,操作速度快
  • 广泛的社区支持和工具生态系统

应用场景

  • 软件开发中的代码版本管理
  • 团队协作开发和代码审查
  • 开源项目的贡献和维护
  • 配置文件和文档的版本控制
  • 自动化部署和持续集成/持续部署(CI/CD)流程

二、参数详解

Git是一个命令行工具集,由主命令git和多个子命令组成。以下是常用的Git子命令及其主要参数:

子命令 说明 常用参数
clone 克隆远程仓库到本地 -b <branch>(指定分支),--depth <n>(浅层克隆)
init 初始化新的Git仓库 --bare(创建裸仓库)
add 添加文件到暂存区 .(所有文件),-u(已跟踪文件),-p(交互式添加)
commit 提交暂存区的更改到本地仓库 -m <message>(提交信息),-a(自动添加修改),--amend(修改上一次提交)
status 查看工作区和暂存区的状态 -s(简短输出),-b(显示当前分支)
diff 查看文件差异 --cached(查看暂存区与HEAD差异),HEAD(查看工作区与HEAD差异)
log 查看提交历史 --oneline(单行显示),--graph(图形化显示),--all(所有分支),--author=<name>(按作者筛选)
branch 分支管理 -a(列出所有分支),-r(列出远程分支),-d(删除分支),-D(强制删除)
checkout 切换分支或恢复文件 -b <branch>(创建并切换分支),--track(跟踪远程分支)
switch 切换分支(Git 2.23+推荐使用) -c <branch>(创建并切换分支),-C <branch>(强制创建并切换)
restore 恢复文件(Git 2.23+推荐使用) --staged(恢复暂存区文件),--source <commit>(从指定提交恢复)
merge 合并分支 --no-ff(禁止快进合并),--squash(压缩合并)
rebase 变基操作 -i <commit>(交互式变基),--onto <branch>(指定基准)
pull 拉取远程仓库更新到本地 --rebase(使用rebase而非merge),-p(修剪已删除的远程分支)
push 推送本地更改到远程仓库 -u(设置上游分支),-f(强制推送),--tags(推送标签)
remote 远程仓库管理 -v(详细信息),add <name> <url>(添加远程仓库),rm <name>(删除远程仓库)
fetch 获取远程仓库更新但不合并 --all(获取所有远程仓库),-p(修剪过时的引用)
tag 标签管理 -a <tag>(创建带注释的标签),-d <tag>(删除标签)
blame 查看文件每行的修改历史 -L <start>,<end>(指定行范围)
stash 暂存当前未提交的更改 -u(包括未跟踪文件),-a(包括忽略的文件),list(列出所有暂存)
bisect 通过二分查找定位引入bug的提交 start(开始),good <commit>(标记为好提交),bad <commit>(标记为坏提交)
revert 撤销指定的提交 -n(不自动提交),--no-edit(使用默认提交信息)
reset 重置当前HEAD到指定状态 --soft(保留工作区和暂存区),--mixed(保留工作区,重置暂存区),--hard(重置工作区和暂存区)

三、基本用法

1. 仓库管理

bash 复制代码
# 克隆远程仓库
git clone https://github.com/user/repo.git

# 克隆特定分支
git clone -b develop https://github.com/user/repo.git

# 浅层克隆(只获取最近n次提交,加快克隆速度)
git clone --depth 1 https://github.com/user/repo.git

# 初始化新的Git仓库
git init new_project
cd new_project

# 查看当前仓库状态
git status

2. 文件操作

bash 复制代码
# 添加单个文件到暂存区
git add filename.txt

# 添加所有文件到暂存区
git add .

# 添加已跟踪文件的修改到暂存区
git add -u

# 交互式添加文件(可选择文件的部分内容)
git add -p

# 提交更改到本地仓库
git commit -m "提交说明"

# 提交时自动添加已跟踪文件的修改
git commit -am "提交说明"

# 修改上一次提交(不改变提交历史)
git commit --amend

# 查看工作区与暂存区的差异
git diff

# 查看暂存区与HEAD的差异
git diff --cached

# 查看工作区与指定提交的差异
git diff HEAD~2

3. 分支管理

bash 复制代码
# 创建新分支
git branch new-feature

# 切换到指定分支
git checkout new-feature

# 创建并切换到新分支(一步完成)
git checkout -b new-feature

# 查看本地分支列表
git branch

# 查看所有分支(包括远程分支)
git branch -a

# 查看远程分支列表
git branch -r

# 重命名当前分支
git branch -m new-name

# 删除本地分支(分支必须已合并到当前分支)
git branch -d old-branch

# 强制删除本地分支(即使分支未合并)
git branch -D stubborn-branch

四、高级用法

1. 远程操作

bash 复制代码
# 查看远程仓库信息
git remote -v

# 添加远程仓库
git remote add origin https://github.com/user/repo.git

# 修改远程仓库URL
git remote set-url origin https://github.com/user/new-repo.git

# 删除远程仓库
git remote rm upstream

# 获取远程仓库的所有更新但不合并
git fetch origin

# 获取所有远程仓库的更新
git fetch --all

# 拉取远程分支更新并合并到当前分支
git pull origin main

# 拉取远程分支更新并使用rebase方式合并
git pull --rebase origin main

# 推送本地分支到远程仓库
git push origin feature-branch

# 设置上游分支(后续可直接使用git push/pull)
git push -u origin feature-branch

# 强制推送(谨慎使用,可能覆盖远程更改)
git push -f origin feature-branch

# 推送所有标签到远程仓库
git push --tags

2. 提交历史管理

bash 复制代码
# 查看简洁的提交历史(单行显示)
git log --oneline

# 查看图形化的提交历史
git log --graph

# 查看所有分支的图形化提交历史
git log --graph --oneline --all

# 查看最近5次提交
git log -5

# 按作者筛选提交
git log --author="John"

# 按提交信息筛选
git log --grep="bugfix"

# 查看特定文件的修改历史
git log --follow file.txt

# 查看提交的详细信息
git show HEAD

# 查看特定提交的详细信息
git show a1b2c3d

# 查看某个文件在特定提交中的变化
git show a1b2c3d:path/to/file.txt

# 查看两个提交之间的差异
git diff commit1 commit2

# 查看两个分支之间的差异
git diff branch1 branch2

3. 高级分支操作

bash 复制代码
# 合并分支到当前分支
git merge feature-branch

# 禁止快进合并,始终创建合并提交
git merge --no-ff feature-branch

# 压缩合并(将多个提交压缩为一个)
git merge --squash feature-branch

# 变基操作(将当前分支的提交应用到目标分支)
git rebase main

# 交互式变基(可编辑、合并、删除提交)
git rebase -i HEAD~5

# 中止变基
git rebase --abort

# 继续变基(解决冲突后)
git rebase --continue

# 跳过当前提交
git rebase --skip

# 将当前分支变基到另一个分支的指定位置
git rebase --onto main starting-point feature-branch

# 捡选特定提交应用到当前分支
git cherry-pick a1b2c3d

# 交互式捡选多个提交
git cherry-pick -n start^..end

4. 标签管理

bash 复制代码
# 创建轻量级标签
git tag v1.0

# 创建带注释的标签
git tag -a v1.0 -m "版本1.0发布"

# 创建针对特定提交的标签
git tag -a v1.0 a1b2c3d -m "版本1.0发布"

# 列出所有标签
git tag

# 搜索标签
git tag -l "v1.*"

# 查看标签的详细信息
git show v1.0

# 删除本地标签
git tag -d v1.0

# 推送特定标签到远程仓库
git push origin v1.0

# 推送所有标签到远程仓库
git push --tags

# 删除远程标签
git push origin --delete v1.0

5. 暂存管理

bash 复制代码
# 暂存当前未提交的更改
git stash

# 暂存当前未提交的更改并添加说明
git stash save "正在进行的工作"

# 暂存包括未跟踪的文件
git stash -u

# 暂存包括所有文件(包括忽略的文件)
git stash -a

# 列出所有暂存
git stash list

# 应用最近的暂存
git stash apply

# 应用特定的暂存
git stash apply stash@{2}

# 应用并删除最近的暂存
git stash pop

# 查看暂存的差异
git stash show

# 查看暂存的详细差异
git stash show -p

# 从暂存创建分支
git stash branch new-branch

# 删除特定的暂存
git stash drop stash@{1}

# 删除所有暂存
git stash clear

6. 查找和比较

bash 复制代码
# 二分查找定位引入bug的提交
git bisect start
git bisect bad HEAD
git bisect good v1.0
# Git会自动检出一个中间提交,测试后执行:
git bisect good  # 如果当前版本正常
git bisect bad   # 如果当前版本有bug
# 找到问题提交后,恢复到原始状态
git bisect reset

# 查找包含特定代码的提交
git log -S "search_string"

# 查找修改了特定路径的提交
git log -- path/to/file

# 查看文件每行的修改历史和作者
git blame file.txt

# 查看文件特定行范围的修改历史
git blame -L 10,20 file.txt

# 比较两个分支中共同文件的不同
git diff branch1 branch2 -- common_file.txt

# 生成差异统计报告
git diff --stat branch1 branch2

7. 撤销和重置

bash 复制代码
# 撤销工作区的更改(恢复到暂存区状态)
git checkout -- file.txt

# 撤销暂存区的更改(保留工作区)
git reset HEAD file.txt

# 重置当前分支到指定提交(保留工作区)
git reset --mixed a1b2c3d

# 重置当前分支到指定提交(保留工作区和暂存区)
git reset --soft a1b2c3d

# 强制重置当前分支到指定提交(丢弃所有更改)
git reset --hard a1b2c3d

# 撤销最近一次提交(创建一个新的撤销提交)
git revert HEAD

# 撤销指定提交(创建一个新的撤销提交)
git revert a1b2c3d

# 批量撤销多个提交
git revert --no-commit HEAD~3..HEAD
git commit -m "撤销最近3次提交"

# 清除未跟踪的文件和目录
git clean -f  # 删除文件
git clean -fd # 删除文件和目录
git clean -fx # 删除包括被.gitignore忽略的文件

8. 高级配置

bash 复制代码
# 设置全局用户名和邮箱
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 设置编辑器
git config --global core.editor "vim"

# 设置默认分支名称
git config --global init.defaultBranch main

# 启用彩色输出
git config --global color.ui auto

# 设置别名(简化常用命令)
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --graph --all --decorate"

git config --global alias.unstage "reset HEAD --"

git config --global alias.last "log -1 HEAD"

# 配置差异工具
git config --global diff.tool vimdiff
git config --global difftool.prompt false

# 配置合并工具
git config --global merge.tool vimdiff
git config --global mergetool.prompt false

# 配置忽略文件的全局规则
touch ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

# 查看当前Git配置
git config --list

五、实用技巧与常见问题

实用技巧

  1. 创建高效的Git别名

    bash 复制代码
    # 添加到~/.gitconfig文件或使用git config命令设置
    [alias]
        st = status
        ci = commit
        co = checkout
        br = branch
        lg = log --oneline --graph --all --decorate
        lga = log --oneline --graph --all --decorate --author="$(git config user.email)"
        unstage = reset HEAD --
        last = log -1 HEAD
        undiff = checkout --
        cm = commit -m
        amend = commit --amend
        cp = cherry-pick
        rb = rebase
        rbi = rebase -i
  2. 自定义Git提示符

    bash 复制代码
    # 在~/.bashrc或~/.zshrc中添加
    # 显示当前分支和状态
    parse_git_branch() {
        git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
    }
    export PS1="\u@\h:\w\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
  3. 批量操作多个仓库

    bash 复制代码
    # 创建一个脚本批量更新所有Git仓库
    cat > update_all_repos.sh << 'EOF'
    #!/bin/bash
    for dir in */; do
        if [ -d "$dir/.git" ]; then
            echo "Updating $dir..."
            cd "$dir"
            git pull
            cd ..
        fi
    done
    EOF
    chmod +x update_all_repos.sh
  4. Git钩子脚本

    bash 复制代码
    # 创建预提交钩子,在提交前运行代码检查
    cat > .git/hooks/pre-commit << 'EOF'
    #!/bin/sh
    # 运行代码风格检查
    echo "Running code style check..."
    # 添加您的检查命令,例如:
    # eslint . || exit 1
    # 如果检查失败,提交将被中止
    exit 0
    EOF
    chmod +x .git/hooks/pre-commit
  5. 选择性地暂存文件部分内容

    bash 复制代码
    # 交互式添加文件的部分内容
    git add -p filename.txt

    然后根据提示选择要暂存的代码块(y=暂存,n=跳过,s=分割,e=编辑)。

  6. 生成代码统计报告

    bash 复制代码
    # 统计每个人的代码贡献
    git shortlog -sn --no-merges
    
    # 统计特定时间段的代码提交
    git log --since="2023-01-01" --until="2023-12-31" --author="John" --oneline | wc -l
    
    # 生成详细的代码统计报告(需要gitstats工具)
    gitstats /path/to/repo /path/to/output
  7. 使用Git工作树管理多个分支

    bash 复制代码
    # 创建一个新的工作树(同一仓库的不同分支)
    git worktree add ../another-branch branch-name
    
    # 列出所有工作树
    git worktree list
    
    # 移除工作树
    git worktree remove ../another-branch

常见问题

  1. 合并冲突

    bash 复制代码
    # 问题:合并分支时出现冲突
    # 解决方法:
    # 1. 查看冲突文件
    git status
    
    # 2. 手动编辑冲突文件,解决标记的冲突
    # 冲突标记如下:
    # <<<<<<< HEAD
    # 你的更改
    # =======
    # 要合并的更改
    # >>>>>>> branch-name
    
    # 3. 解决冲突后,标记文件为已解决
    git add resolved_file.txt
    
    # 4. 继续合并
    git merge --continue
    
    # 或者使用合并工具
    git mergetool
  2. 误删分支或提交

    bash 复制代码
    # 问题:不小心删除了重要分支或提交
    # 解决方法:
    # 1. 查看Git引用日志(记录所有HEAD更改)
    git reflog
    
    # 2. 找到删除前的提交哈希值,然后恢复
    git checkout -b recovered-branch a1b2c3d
    
    # 3. 或者使用git fsck查找悬空的提交
    git fsck --lost-found
  3. 忘记添加某些文件到提交

    bash 复制代码
    # 问题:提交后发现忘记添加某些文件
    # 解决方法:
    # 1. 添加遗漏的文件
    git add forgotten_file.txt
    
    # 2. 修改上一次提交(不创建新提交)
    git commit --amend --no-edit
    
    # 注意:如果已经推送到远程,需要强制推送
    # git push -f origin branch-name (谨慎使用)
  4. 远程分支已删除但本地仍显示

    bash 复制代码
    # 问题:远程分支已被删除,但在本地git branch -a中仍显示
    # 解决方法:
    # 方法1:修剪单个分支
    git remote prune origin
    
    # 方法2:在拉取时自动修剪
    git pull -p
    
    # 方法3:设置默认自动修剪
    git config --global fetch.prune true
  5. Git仓库过大

    bash 复制代码
    # 问题:Git仓库变得过大,影响性能
    # 解决方法:
    # 1. 检查大文件
    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print $1}')"
    
    # 2. 使用git-lfs管理大文件(需要安装Git LFS)
    git lfs track "*.pdf"
    git add .gitattributes
    git commit -m "Track PDFs with Git LFS"
    
    # 3. 对于已经提交的大文件,可以使用git filter-repo(谨慎使用)
    # 需要先安装git-filter-repo
    git filter-repo --path path/to/large/file --invert-paths
  6. .gitignore文件不生效

    bash 复制代码
    # 问题:添加了.gitignore规则,但Git仍然跟踪某些文件
    # 解决方法:
    # 1. 确保文件尚未被跟踪
    # 如果文件已被跟踪,需要先从暂存区移除
    git rm --cached file-to-ignore.txt
    
    # 2. 检查.gitignore文件格式是否正确
    cat .gitignore
    
    # 3. 清除Git缓存
    git rm -r --cached .
    git add .
    git commit -m "Fix .gitignore"
  7. 权限被拒绝(Permission denied)

    bash 复制代码
    # 问题:执行Git操作时遇到权限被拒绝错误
    # 解决方法:
    # 1. 检查SSH密钥是否正确设置
    ssh -T git@github.com
    
    # 2. 确保有足够的文件系统权限
    ls -la .git
    
    # 3. 检查远程仓库的访问权限
    # 确保您有推送到远程仓库的权限
    
    # 4. 对于HTTPS方式,检查凭证是否正确
    git credential-cache exit
    # 然后重新执行Git操作,输入正确的用户名和密码/令牌
  8. 文件权限变更导致的Git状态变化

    bash 复制代码
    # 问题:文件权限变更导致Git将其标记为已修改
    # 解决方法:
    # 1. 忽略文件权限变更
    git config --global core.fileMode false
    
    # 2. 临时忽略当前的权限变更
    git update-index --chmod=-x file.sh  # 移除执行权限
    git update-index --chmod=+x file.sh  # 添加执行权限

六、总结

git命令是现代软件开发中不可或缺的工具,它通过强大的分布式版本控制能力,帮助开发者高效地管理代码、跟踪变更、协作开发和维护项目。本文详细介绍了Git的核心功能、常用命令、高级技巧和常见问题解决方案,覆盖了从基础的仓库管理、文件操作到复杂的分支管理、远程协作和问题排查等多个方面。

掌握Git不仅能够提高个人开发效率,还能促进团队协作,确保代码质量和项目稳定性。无论是个人项目还是大型团队开发,Git都能提供灵活的工作流支持和可靠的版本控制保障。

在使用Git的过程中,建议遵循以下最佳实践:

  1. 频繁提交,保持提交粒度合理
  2. 编写清晰、有意义的提交信息
  3. 善用分支,保持主分支稳定
  4. 定期与远程仓库同步
  5. 在重要操作前创建备份
  6. 使用.gitignore文件排除不需要版本控制的文件
  7. 为常用命令设置别名,提高工作效率

通过不断实践和探索,您将能够更加熟练地使用Git,充分发挥其在软件开发中的强大作用。无论是解决复杂的合并冲突,还是管理大型项目的多个分支,Git都将成为您可靠的助手和伙伴。

相关推荐
半夏知半秋2 小时前
docker常用指令整理
运维·笔记·后端·学习·docker·容器
sishen41992 小时前
嵌入式Linux没有学习方向怎么办,嵌入式Linux怎么学
linux
逆风水手2 小时前
Ansible自动化运维入门指南
linux·运维·自动化·ansible
LXS_3572 小时前
Day 18 C++提高 之 STL常用容器(string、vector、deque)
开发语言·c++·笔记·学习方法·改行学it
蒸蒸yyyyzwd2 小时前
网络编程——threadpool.h学习笔记
笔记·学习
浪子不回头4152 小时前
SGLang学习笔记
人工智能·笔记·学习
INFINI Labs3 小时前
Easy-Es 2.1.0-easysearch 版本发布
大数据·elasticsearch·搜索引擎·easysearch·easy-es
全栈陈序员3 小时前
理解 Git 的第一步:什么是版本控制系统?
git
lhrimperial4 小时前
Elasticsearch核心技术深度解析
大数据·elasticsearch·搜索引擎