跳转到内容

首次使用

bash
git init
git remote add origin git@github.com:xxx/xxx.git

git pull origin master

git push origin master

git add .
git commit -m "init commit"

常规命令

bash
# 初始化
git init
# 查看版本
git --version
# 开启颜色
git config --global color.ui true

# 快速标记添加已跟踪的文件
git add test.txt

# 选择性添加
git add -u

git add -i

# 查看详细日志
git log
# 查看精简日志
git log --stat
# 查看当前git状态
git status

# 查看当前git精简状态
git status -s
# 查看当前git目录与最新提交的区别	
git diff
# 与stage暂存区对比
git diff --staged
# 目录树
git ls-tree -l HEAD
# 详细目录树
git ls-files -s

git show commit_id

# 切换历史记录
git reflog show

# 
git checkout
# 切换到当前分支指定 commit_id
git checkout commit_id
# 切换并新建本地 dev 分支
git checkout -b dev
# 新建分支并切换到远程分支 git checkout -b 本地分支名 origin/远程分支名
git checkout -b dev origin/dev
# 切换本地分支
git checkout dev

# 对比两个分支的区别
git diff master dev
# 将当前分支与dev分支合并
git merge dev        
# 查看远程/本地分支
git branch -a
# 删除本地 dev 分支
git branch -d dev
# 保存当前的工作进度
git stash
# 显示进度列表
git stash list
# 保存当前进度并添加信息
git stash save "msg"
# 查看所有标签
git tag
# 创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a v0.1 -m "version 0.1 released" commit_id
# 删除
git rm filename
# 恢复
git checkout HEAD~1 -- somefile
# 回滚到之前的提交记录
git reset --hard commit_id
# 强制撤销提交,覆盖工作区与暂存区
git reset --hard HEAD^
# 克隆
git clone
# 查看没有被版本库任何引用关联的松散对象
git fsck
# 彻底清除没有未关联的松散对象
git prune
# 推送远程 dev 分支
git push origin dev
# 删除远程指定 dev 分支
git push --delete origin dev
# 将分支master转移到特定提交dev上去, 分支的转移
git rebase dev master
# 从当前提交到dev提交之间的所有commit, 都可以被编辑, 可以被修改提交顺序
git rebase dev

# 往暂存区添加了没用的文件想撤销,但是还没有提交代码。
git reset file
# 如果你想从暂存区移除所有没有提交的修改
git reset

# 退出 git console 
q

命令释义

配置用户信息

sh
# 没有 user.name 和 user.email 就输入下面命令
git config --list
#
git config --global user.name  "androllen"  
git config --global user.email "androllen#hotmail.com"
# Push 的时候就会弹出登录框

配置代理

注意

注意修改成自己的IP和端口号

git config --global http.proxy http://127.0.0.1:7890

git config --global https.proxy http://127.0.0.1:7890

提交

bash
# 提交
git commit -m "some need to say..."
# 允许空白提交
git commit --allow-empty
# 修改刚才提交的注释信息
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”

# 假如已经将代码提交(git commit)推送(git push)到了远程分支,那么你需要通过下面的命令强制推送这次的代码提交。
git push remote branch --force

Github 加速

bash
# C:\Windows\System32\drivers\etc
199.232.5.194 github.global.ssl.fastly.net
140.82.114.4 github.com
199.232.68.133 avatars0.githubusercontent.com
199.232.28.133 avatars1.githubusercontent.com
199.232.68.133 avatars2.githubusercontent.com
199.232.68.133 avatars3.githubusercontent.com

存储方式

bash
# 最新 Changes 的版本
工作区 Changes
# 等待提交最新的代码
暂存区 Staged
# 最新的 Commit 的版本
提交区 Commit
bash
# 暂存区的目录树,记录文件名和文件状态信息(时间戳,长度等)
.git/index
# 索引建立了文件与对象库的连接
.git/objects

HEAD表示版本库中最近的一次提交.
HEAD^表示上一次提交.
HEAD^^表示HEAD^的父提交.

但是如果一个提交有多个父提交呢?
HEAD^1表示HEAD的多个父提交中的第一个父提交.
HEAD^2表示HEAD的多个父提交中的第二个父提交.
HEAD^^2表示HEAD^的多个父提交中的第二个父提交.

HEAD~5 相当于HEAD^^^^^

查看提交对应的树对象 HEAD^

查看提交的某具体文件 HEAD:path/to/file

上面的HEAD都可以替换为其他引用或者具体的ID.

文件忽略 ignore

在目录下, 添加.gitignore文件. 打开 .gitignore 添加要忽略的文件, 如*.json,*.txt .gitignore的作用范围是本目录及其子目录.

bash
# 可以使用下面命令查看被忽略的文件
git status --ignored 
# 如果要在屏蔽*.h的情况下添加一个具体的hello.h
git add -f hello.h

文件归档

bash
# 基于最新提交建立归档文件latest.zip
git archive -o latest.zip HEAD
# 只将目录src/和doc/建立到归档partial.tar中
git archive -o partial.tar HEAD src doc
# 基于里程碑v1.0建立归档, 并为归档中的文件添加目录前缀1.0
git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz

解决 git 日常问题

  • 解决 Vs Code 中 Git 总让输入用户名及密码问题

    sh
    git config --global credential.helper store
  • 解决 git clone Authentication failed 的问题

    sh
    git config --system --unset credential.helper
    git clone http://gitlab.4dogs.cn/yourname/project.git
  • 删除本地仓库的最近一次 commit_id

    sh
    VSCode -> Source Control -> More -> Commit -> Undo Last Commit
  • 删除远程仓库的 commit_id

    sh
    # 配合 VSCode 使用更佳
    git log
    # 切换到删除 commit_id 前一个 commit_id
    git checkout 22dfbf1f907764c5ae70381b8191104f9af21d8c
    # 新建 dev 分支
    git checkout -b dev 22dfbf1f907764c5ae70381b8191104f9af21d8c
    # 查看分支
    git branch
    
    在dev分支上修改内容
    
    # 最好用 VSCode 提交到远程更安全
    # 关联远程分支 提交dev分支代码到远程
    git push --set-upstream origin dev
    
     GitHub 上设置dev分支为主分支
    
     GitHub 上删除 master 分支
    
     GitHub dev分支 新建 master 分支
    
     GitHub 设置新 master 分支为主分支
    
     GitHub 删除 dev 分支
    
    重新 git clone your.git 
    
    或者 
    git checkout -q master
    # 如果没有从远程拉取代码就不需要
    git reset --soft HEAD~
  • 查看历史记录

    sh
    # 查看 dev 分支倒数第三个节点的提交id
    git show dev~3
    
    # 查看代码改动
    git show commit_id
    
    # 记录HEAD节点和分支引用所指向的历史
    git reflog
    
    # 查看指向HEAD节点之前的历史记录
    git log

    git init git add . git reset --soft HEAD~ 已在暂存区的文件进行修改想 git restore README.md git rm --cached README.md

  • undo last commit git reset --soft HEAD~

  • commit all(amend) git add -A -- . git commit --amend

  • undo last commit git reset --soft HEAD@

重置引用可以对暂存区或工作区进行重置

git reset [--soft | --mixed | --hard | --merge | --keep] [-q] [commit]

  1. 替换引用的指向, 即将引用(当前引用是HEAD)中包含的commit的ID替换, 改变引用所指向的commit.
  2. 替换暂存区, 将暂存区index的目录树内容 和 引用指向的内容相同.
  3. 替换工作去, 将工作区的内容变得和暂存区内容一致.
    其中,
    --hard 选项, 执行1,2,3操作.
    --soft 执行1操作,只改变引用HEAD指向.
    --mixed(默认情况),执行操作1,2, 即更改HEAD引用的指向以及暂存区。

重置git reset的默认值是HEAD, 重置一般用于重置暂存区(除非使用hard参数,否则不会覆盖工作区)
检出git checkout 的默认值是暂存区,检出命令主要用于覆盖工作区

bash
# 相当于--mixed选项,但是没有提供commit,故HEAD的指向没有改变, 只是将暂存区改于HEAD一致
git reset
# 效果同上
git reset HEAD 
# 将HEAD中的filename覆盖暂存区, 即取消了git add filename的影响,相当于反操作
git reset -- filename
# HEAD^表示HEAD的parent commit, 即上一次提交;即只改变了HEAD的指向,向上回溯
git reset --soft HEAD^     
(用于对刚才的提交不满意, 不改动暂存区与工作区, 而重置HEAD以重新提交.)

Git Revert Commit——如何撤消上次提交

Released under the MIT License.