Git手册

Git手册
 最后更新于 2025年12月11日 00:04:10

一、总览

Loading...

二、五种状态间的顺序操作

1、四个区

  • 工作区(Working Area)
  • 暂存区(Stage)
  • 本地仓库(Local Repository)
  • 远程仓库(Remote Repository) ![cover1533830561536.png](object Object)

2、五种状态

  • 未修改(Origin)
  • 已修改(Modified)&未追踪(Untracked)
  • 已暂存(Staged)
  • 已提交(Committed)
  • 已推送(Pushed)

3、顺序操作

  • 第零步:工作区与仓库保持一致
  • 第一步:文件增删改,变为已修改状态
  • 第二步:Git add ,变为已暂存状态
$ git add --all # 当前项目下的所有更改
$ git add .  # 当前目录下的所有更改
$ git add xx/xx.py xx/xx2.py  # 添加某几个文件
  • 第三步:Git commit,变为已提交状态
$ git commit -m"<这里写commit的描述>"
  • 第四步:Git push,变为已推送状态
$ git push -u origin master # 第一次需要关联上
$ git push # 之后再推送就不用指明应该推送的远程分支了

三、五种状态间的撤销操作

已修改,但未暂存

$ git diff # 列出所有的修改
$ git diff xx/xx.py xx/xx2.py # 列出某(几)个文件的修改
$ git checkout # 撤销项目下所有的修改
$ git checkout . # 撤销当前文件夹下所有的修改
$ git checkout xx/xx.py xx/xx2.py # 撤销某几个文件的修改
$ git clean -f # untracked状态,撤销新增的文件
$ git clean -df # untracked状态,撤销新增的文件和文件夹

# Untracked files:
#  (use "git add <file>..." to include in what will be committed)
#
#   xxx.py

已暂存,未提交

这个时候已经执行过Git add,但未执行Git commit,但是用Git diff已经看不到任何修改。 因为Git diff检查的是工作区与暂存区之间的差异。

$ git diff --cached # 这个命令显示暂存区和本地仓库的差异
$ git reset # 暂存区的修改恢复到工作区
$ git reset --soft # 与git reset等价,回到已修改状态,修改的内容仍然在工作区中
$ git reset --hard # 回到未修改状态,清空暂存区和工作区
git reset --hard 操作等价于 git reset git checkout 2步操作

已提交,未推送

执行完commit之后,会在仓库中生成一个版本号(hash值),标志这次提交。之后任何时候,都可以借助这个hash值回退到这次提交。

$ git diff <branch-name1> <branch-name2> # 比较2个分支之间的差异
$ git diff master origin/master # 查看本地仓库与本地远程仓库的差异
$ git reset --hard origin/master # 回退与本地远程仓库一致
$ git reset --hard HEAD^ # 回退到本地仓库上一个版本
$ git reset --hard <hash code> # 回退到任意版本
$ git reset --soft/git reset # 回退且回到已修改状态,修改仍保留在工作区中。

已推送到远程

$ git push -f orgin master # 强制覆盖远程分支
$ git push -f # 如果之前已经用 -u 关联过,则可省略分支名

慎用,一般情况下,本地分支比远程要新,所以可以直接推送到远程,但有时推送到远程后发现有问题,进行了版本回退,旧版本或者分叉版本推送到远程,需要添加 -f参数,表示强制覆盖。


四、常用命令

mkdirt local-github                 // 创建一个空文件夹
git init                            // 创建git仓库
echo > file                         // dos命令创建一个文本文件
rm file                             // 删除工作区文件
git rm file                         // 删除文件  版本库和工作区同时删除
git rm —cached                      // 删除版本库文件,工作区保留
cat file                            // git命令查看文件内容
git status                          // 查看工作区中所有修改过的文件
git diff file                       // 查看文件的修改情况 + 为修改后的版本
git diff HEAD file                // 查看工作区文件与版本库文件的内容不同
git add file                        // 提交需要更新的文件到track(暂存区)
git checkout file                 // 工作区的修改全部撤销
                                    // 第一种情况:修改后没有提交到track,撤销修改就和版本库文件相同
                                    // 第二种情况:已提交到track,又做了修改,撤销修改为最近添加到track的状态
                                    // 第三种情况: 本地删除了文件,从版本库恢复到工作区
git reset HEAD file                 // 将track中的修改撤销,重新放回工作区
git commit -m ‘版本说明信息’         // 从track中提交版本
git log                             // 查看所有版本及相关详细信息
git log —pretty=oneline             // 查看所有版本的简略信息(版本号、版本说明信息)
git log -1                          // 查看最后一次提交信息(文件新增信息)
git reflog                          // 查看所有版本操作信息(新增版本commit、回到版本reset)
git reset —hard HEAD^               // 回退到上一个版本
git reset —hard HEAD~100            // 回退到上100个版本
git reset —hard 版本id              // 回退/前进到指定版本

分支

git checkout -b dev                 // 创建 dev 分支并切换
git branch dev                      // 创建 dev 分支
git checkout dev                    // 切换 dev 分支
git branch                          // 查看分支. 为当前分支
git merge dev                       // 合并指定分支到当前分支
git branch -d dev                   // 删除 dev 分支
git branch -D dev                   // 强行删除,丢弃未合并的分支

全局配置

git config —global color.ui true    // 显示不同的颜色

项目配置

配置用户名和密码 第一次输入后无需再次输入
.git/config 配置文档中填入下面两条配置信息
  [credential]
      helper = store

五、远程仓库

推送到 GitHub

  1. 创建 SSH Key 在 C:/user/administrator/ 目录下有无 .ssh 文件夹及文件夹内的 id_rsaid_rsa.pub 两个文件 若没有 打开 Git Bash 创建 SSH Key $ ssh-keygen -t rsa -C 'youremail@example.com'
  2. 一路回车使用默认值. id_rsa 为私钥 id_rsa.pub 为公钥
  3. 登陆 GitHub, Settings > SSH and GPG keys > New SSH key 在页面中填写一组SSH key,Title为任意,key为 id_rsa.pub 的内容
  4. 本地关联远程库并推送
// 关联GitHub的线上仓库
git remote add origin git@github.com:GitHub账户/仓库名.git
// 将本地库推送到远程 origin为远程库名 master为当前分支
git push -u origin master
// 克隆线上版本库
git clone git@github.com:GitHub账户/仓库名.git

六、Linux 创建 Git 仓库

// 创建文件夹
mkdir work
cd work
// 创建git仓库(服务端)
git init --bare
// 修改仓库的用户和用户组,否则无操作权限
chown git:git -R work

// 创建一个post-receive 勾子,用于提交代码后,自动将代码更新到 web目录
vim ./hooks/post-receive

// 写入下面内容,注意 --work-tree 后面的路径为 web目录 的绝对路径
#! /bin/sh
git --work-tree=/home/work git checkout -f

// post-receive 文件 增加执行权限
chmod +x test_git/hooks/post-receive

七、忽略特殊文件

.gitignore 文件中填写不需要提交到版本库的文件名并推送到版本库,Git会忽略这些文件,Git status 时不会提示有文件未推送 格式如下:

# Windows:
    Thumbs.db
    ehthumbs.db
    Desktop.ini
# Python:
    .py[cod]
    .so
    .egg
    *.egg-info
    dist
    build
# My configurations:
    db.ini
    deploy_key_rsa

git add -f file                              // 强制推送,忽略 .gitignore 中规则
git check-ignore -v file                     // 查询哪条规则不允许该文件推送

八、命令别名

配置文件存放在 .git/config 文件 [alias] 中,一行对应一条规则

[alias]
    last = log -1
git config —global alias.st status                            // git status => git st
git config —global alias.co checkout                          // git checkout => git co
git config —global alias.ci commit                            // git commit => git ci
git config —global alias.br branch                            // git branch => git br
git config —global alias.unstage 'reset HEAD'                 // git reset HEAD file => git unstage file
git config —global alias.last 'log -1'                        // git log -1 => git last

git config —global alias.lg "log —color —graph —pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ —abbrev-commit"       // git log => git lg

九、QA

1、问题:分支合并出现冲突解决方法?

原因:

各分支对同一个文件做了修改并推送到版本库,这时合并分支时(merge)就会出现冲突错误,需要手动解决

$ git merge dev
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.

这时查看文件内容 cat 1.txt Git用 <<<<<<<=======>>>>>>> 标记出不同分支的内容 手动修改文件后再提交

// 查看分支的合并情况
git log —graph —pretty=oneline —abbrev-commit

2、问题:当前分支正在进行但要暂停且不能提交,去操作另一个分支?

**解决:**将当前分支 stash 存储

git stash                           // 存储当前分支
git stash list                      // 查看 stash 的列表(可能会有多次存储)
git stash apply stash@{<number>}    // 指定 stash list 中的一个存储恢复到工作区,但 stash list 不会删除
git stash pop                       // stash list 恢复,会删除 stash list