首次使用
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"
常规命令
# 初始化
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
命令释义
配置用户信息
# 没有 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
提交
# 提交
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 加速
# 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
存储方式
# 最新 Changes 的版本
工作区 Changes
# 等待提交最新的代码
暂存区 Staged
# 最新的 Commit 的版本
提交区 Commit
# 暂存区的目录树,记录文件名和文件状态信息(时间戳,长度等)
.git/index
# 索引建立了文件与对象库的连接
.git/objects
HEAD
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的作用范围是本目录及其子目录.
# 可以使用下面命令查看被忽略的文件
git status --ignored
# 如果要在屏蔽*.h的情况下添加一个具体的hello.h
git add -f hello.h
文件归档
# 基于最新提交建立归档文件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 总让输入用户名及密码问题
shgit config --global credential.helper store
解决 git clone Authentication failed 的问题
shgit config --system --unset credential.helper git clone http://gitlab.4dogs.cn/yourname/project.git
删除本地仓库的最近一次 commit_id
shVSCode -> 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]
- 替换引用的指向, 即将引用(当前引用是HEAD)中包含的commit的ID替换, 改变引用所指向的commit.
- 替换暂存区, 将暂存区index的目录树内容 和 引用指向的内容相同.
- 替换工作去, 将工作区的内容变得和暂存区内容一致.
其中,
--hard 选项, 执行1,2,3操作.
--soft 执行1操作,只改变引用HEAD指向.
--mixed(默认情况),执行操作1,2, 即更改HEAD引用的指向以及暂存区。
重置git reset的默认值是HEAD, 重置一般用于重置暂存区(除非使用hard参数,否则不会覆盖工作区)
检出git checkout 的默认值是暂存区,检出命令主要用于覆盖工作区
# 相当于--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以重新提交.)