Git Notes

plus2047 于 2021-10-19 发布

Git 基本命令速查表。

Git 的核心概念为 Branch. Branch 是一条文件历史线,可以提交、回滚。可以开启不同的 Branch, 在各个 Branch 上独立开发,然后可以从某个 Branch 吸收更改到当前 Branch. 远程管理的基本方式也是 Branch 之间(而不是整个代码库)的推送。

Git 基本命令

# 在一个已经存在的目录中初始化 git
git init
# 或者从远程仓库 clone
git clone <url>
# 把 git 内容打包到一个 ZIP 文件
git archive -o latest.zip HEAD

# branch 内的操作。文件提交、回滚。 =====
# 添加文件到 git 的监控中
git add --all
git add <filename>
git rm <filename>
# 提交更改到当前分支。-a 表示提交所有更改,-m 表示附带消息(否则会自动开一个编辑器写消息)
git commit -am "hello"
# 追加 commit, 追加当前内容到最后一次 commit 上
git commit –-amend
# 删除所有不在 .gitignore 中的文件,一种暴力但可靠有效的方法
git rm -r --cached .
git add .
# 查看提交历史 
git log
# 快照之间的切换
# 查看快照历史
git log
# 回退到某一个版本
git reset --hard HEAD
git reset --hard HEAD~100
# 知道 commit-id 时,切换到某个 commit
git reset --hard commit-id
# 撤销 add <?>
git reset <file>  # reset one file
git reset  # reset all file
# 查看最近提交的 commit-id
git reflag
# 恢复某个文件到上一次提交状态(丢弃当前更改):
get checkout filename

# branch (分支) 操作 =====
# 创建分支
git branch new_branch
# 切换到新分支
git checkout new_branch
# 创建并切换到新分支
git checkout -b new_branch
# 切换到某远程分支(把远程分支映射到本地)
git checkout -b new_branch origin/new_branch
# git checkout master
git merge new_branch

# 远程操作
# 从 GUTHUB 拉取 git 代码库
git clone https://github.com/abc/def.git
# clone into special folder
git clone https://github.com/abc/def.git folder_name 
# 添加远程仓库
git remote add origin <github-url>
# (--force 强制) 将本地 master 分支推送到 origin master 分支, -u 设置本地分支跟踪远程分支。要求有项目的写权限。
git push -u --force origin master
# 提交更改。提交到当前分支跟踪的远程分支。可以使用上一条命令设置。clone 的情况下会自动设置远程仓库。
git push
# 本地 branch1 推送到 origin:branch2 分支
git push origin branch1:branch2
# 拉取更新
git pull

# 全局设置自动存储用户名和密码
git config --global credential.helper store

# 强制将本地仓库推送到远程并覆盖远程仓库,用于强制初始化 git 仓库
git remote add origin <github-uri>
git push -u --force origin master
git push origin branch1:branch2

# 关于子项目
# 有些项目有递归项目,递归克隆命令:
git clone --recursive <url>
# 如果 clone 的时候忘记递归了,之后再拉取自项目
git submodule update --init --recursive

# 关于 stash
# 暂存快照和应用快照。用于:当前目录有更改,但是要切换到新的 branch
git stash save
git stash apply
git checkout stash -- .  # 强制使用 stash 覆盖当前工作目录
# 两个快照之间对比个别文件
git diff stash@{0}^1 stash@{0} -- <filename>
# 快照与当前工作目录之间对比个别文件
git diff stash@{0} -- <filename>
# 恢复个别文件
git checkout stash@{0} -- <filename>

GITIGNORE

# 隐藏根目录和任何子目录下的 bin 分支:
bin/
# 隐藏特定格式的文件
*.iml

白名单模式(慎用):

白名单模式的问题是白名单语法与正常语法不完全一样。如 !*.cpp 只能将根目录下的 *.cpp 加入白名单,而不能将所有目录下的 *.cpp 加入白名单。

*
!main.cpp

Update: 前辈告诉我大家一般都用 SourceTree GUI GIT 客户端 :( 详情请移步 SourceTree 教程 😂

项目同时推送到 Github 和 Coding

在你 Github 和 Coding 两个项目下的 .git/config 里,加上:[remote “all”]

  url = git@github.com:<username>/<repo>.git
  url = git@gitcafe.com:<username>/<repo>.git 

此时 git remote -v 检查是否已有一个叫 all 的 remote。 以后 git push all 即可推送到两者。

Git Bundle

git bundle is another command that may be used for backup purposes. It will create a single file containing all the refs you need to export from your local repository. It’s often used for publishing commits via USB keys or other media in absence of a connection.

For one branch, it’s simple. This command will create a myrepo.bundle file.

git bundle create myrepo.bundle master

For more branches or tags, it’s still simple:

git bundle create myrepo.bundle master other_branch

Restoring the content of the bundle is a single comment. Inside an empty repo, type:

git bundle unbundle myrepo.bundle

Instead if you do not have a repo, and just want to recreate the old one:

git clone myrepo.bundle -b master myrepo_folder