【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都将成为您可靠的助手和伙伴。

相关推荐
SPC的存折9 小时前
1、Redis数据库基础
linux·运维·服务器·数据库·redis·缓存
爱学习的小囧9 小时前
VMware ESXi 6.7U3v 新版特性、驱动集成教程和资源包、部署教程及高频问答详情
运维·服务器·虚拟化·esxi6.7·esxi蟹卡驱动
小疙瘩10 小时前
只是记录自己发布若依分离系统到linux过程中遇到的问题
linux·运维·服务器
dldw77710 小时前
IE无法正常登录windows2000server的FTP服务器
运维·服务器·网络
我是伪码农11 小时前
外卖餐具智能推荐
linux·服务器·前端
汤愈韬11 小时前
下一代防火墙通用原理
运维·服务器·网络·security
皮皮林55111 小时前
强烈建议大家使用 Linux 做开发?
linux
IMPYLH12 小时前
Linux 的 od 命令
linux·运维·服务器·bash
Kk.080213 小时前
Linux(十一)fork实例练习、文件操作示例及相关面试题目分享
linux·运维·算法
数据雕塑家13 小时前
Linux下大文件切割与合并实战:解决FAT32文件系统传输限制
linux·运维·服务器