git常用命令
- 初始化一个Git仓库,使用
git init命令。 - 添加文件到Git仓库,分两步:
- 使用命令
git add <file>,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>,完成。
- 使用命令
💡 使用命令
git commit --amend修正最后一次提交
- 要随时掌握工作区的状态,使用
git status命令。 - 如果
git status告诉你有文件被修改过,用git diff可以查看修改内容。
回退
git log命令显示从最近到最远的提交日志- 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
--pretty=oneline参数 - 用
HEAD表示当前版本,上一个版本就是HEAD^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
- 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
- 回退到上一版本
- 撤销add和commit,不保存代码修改
git reset --hard HEAD^ - 撤销add和commit,保存代码修改
git reset HEAD^或git reset --mixed HEAD^ - 只撤销commit
git reset --soft HEAD^ git reset --hard origin/master或git fetch —all- 强制推送远程
git push origin HEAD --force
- 撤销add和commit,不保存代码修改
git reflog用来记录你的每一次命令- 命令
git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:- 一种是
readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; - 一种是
readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 - 总之,就是让这个文件回到最近一次git commit或git add时的状态。
- 一种是
- 命令
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区 - 命令
git rm用于删除一个文件
关联远程库
- 要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git; - 关联一个远程库时必须给远程库指定一个名字,
origin是默认习惯命名; - 关联后,使用命令
git push -u origin master第一次推送master分支的所有内容; - 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master推送最新修改; - 如果添加的时候地址写错了,或者就是想删除远程库,可以用
git remote rm <name>命令。使用前,建议先用git remote -v查看远程库信息
分支
- 分支
- 查看分支:
git branch - 创建分支:
git branch <name> - 创建分支并关联远程:
git checkout -b devbranch origin/devbranch - 手动关联上游分支:
git branch --set-upstream develop origin/develop - 切换分支:
git checkout <name>或者git switch <name> - 创建+切换分支:
git checkout -b <name>或者git switch -c <name> - 合并某分支到当前分支:
git merge <name> - 删除分支:
git branch -d <name>
- 查看分支:
- 分支合并图
git log --graph --pretty=oneline --abbrev-commit - 合并分支时,加上—no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
- BUG分支
git stash可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作- 可以多次
stash,恢复的时候,先用git stash list查看,然后恢复指定的stash - 工作现场还在,Git把
stash内容存在某个地方了,但是需要恢复一下,有两个办法:- 一是用
git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除; - 另一种方式是用
git stash pop,恢复的同时把stash内容也删了
- 一是用
- Git专门提供了一个
cherry-pick命令,让我们能复制一个特定的提交到当前分支git cherry-pick 4c805e2
多人协作
- 要查看远程库的信息,用
git remote,用git remote -v显示更详细的信息 - 推送分支
git push origin mastergit push origin dev
- 要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支
git checkout -b dev origin/dev
- 推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,先用
git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送- 指定本地dev分支与远程origin/dev分支的链接
git branch --set-upstream-to=origin/dev dev
git pullgit commit -m "fix env conflict"
- 指定本地dev分支与远程origin/dev分支的链接
- 多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功! - 如果
git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
- 首先,可以试图用
标签
- 命令
git tag <name>就可以打一个新标签 - 命令
git tag查看所有标签 - 对提交打标签
git tag v0.9 f52c633 - 用
git show <tagname>查看标签信息 - 创建带有说明的标签,用
-a指定标签名,-m指定说明文字git tag -a v0.1 -m "version 0.1 released" 1094adb
- 命令
git push origin <tagname>可以推送一个本地标签; - 命令
git push origin --tags可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>可以删除一个远程标签。 - 查询远程tags
git ls-remote --tags origin
别名
git config --global alias.st statusgit config --global alias.unstage 'reset HEAD'git config --global alias.last 'log -1'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 config —global url.”https://hub.fastgit.xyz/“.insteadOf “https://github.com/”
git config protocol.https.allow always`
git config --global http.proxy http://127.0.0.1:7890
199.232.69.194 github.global.ssl.fastly.net # github 140.82.114.3 github.com # github
单分支克隆
git clone --branch=master --single-branch --filter=blob:none https://xxx.git
# 添加分支
git remote set-branches --add origin branch_name
git fetch origin
# 添加所有分支
git remote set-branches origin '*'
git fetch补充
- 查看每次提交修改内容
git whatchanged - 更改远程地址
git remote set-url origin https://github.com/kwin-scripts/kwin-tiling.git - 查看远程地址
git remote get-url origin - git 版本号
tag='3.4.1'
echo "${tag}.r$(git rev-list --count ${tag}..HEAD).$(git rev-parse --short HEAD)"- 忽略文件
vi .git/info/exclude - 查找大文件
git rev-list --objects --all | git cat-file --batch-check="%(objectname) %(objectsize) %(rest)" | sort -nuk2
克隆子文件夹
mkdir myrepo
cd myrepo
git init
git remote add origin <url>
git config core.sparseCheckout true
echo "src/" >> .git/info/sparse-checkout
git fetch --depth=1 origin main
git checkout main
# or
mkdir myrepo
cd myrepo
git init
git remote add origin <url>
git sparse-checkout init
git sparse-checkout set <directory-or-file-path>
git fetch --depth=1 origin main
git checkout main克隆子模块
# https://stackoverflow.com/questions/53896924/convert-gitmodules-into-a-parsable-format-for-iteration-using-bash/53899440#53899440
install_submodules() {
git -C "${REPO_PATH}" config -f .gitmodules --get-regexp '^submodule\..*\.path$' |
while read -r KEY MODULE_PATH; do
# If the module's path exists, remove it.
# This is done b/c the module's path is currently
# not a valid git repo and adding the submodule will cause an error.
[ -d "${MODULE_PATH}" ] && sudo rm -rf "${MODULE_PATH}"
NAME="$(echo "${KEY}" | sed 's/^submodule\.\(.*\)\.path$/\1/')"
url_key="$(echo "${KEY}" | sed 's/\.path$/.url/')"
branch_key="$(echo "${KEY}" | sed 's/\.path$/.branch/')"
URL="$(git config -f .gitmodules --get "${url_key}")"
BRANCH="$(git config -f .gitmodules --get "${branch_key}" || echo "master")"
git -C "${REPO_PATH}" submodule add --force -b "${BRANCH}" --name "${NAME}" "${URL}" "${MODULE_PATH}" || continue
done
git -C "${REPO_PATH}" submodule update --init --recursive
}