您现在的位置是:网站首页> 编程资料编程资料
Git科普文,Git基本原理及各种骚操作(推荐)_相关技巧_
2023-05-27
366人已围观
简介 Git科普文,Git基本原理及各种骚操作(推荐)_相关技巧_
Git简单介绍
Git
是一个分布式版本控制软件,最初由Linus Torvalds
创作,于2005年以GPL
发布。最初目的是为更好地管理Linux
内核开发而设计。
Git工作流程以及各个区域
- Workspace:工作区
- Staging/Index:暂存区
- Local Repository:本地仓库(可修改)
- /refs/remotes:远程仓库的引用(不可修改)
- Remote:远程仓库
Git文件状态变化
Git各种命令
Git简单命令
# 在当前目录新建一个git仓库 git init # 打开git仓库图形界面 gitk # 显示所有变更信息 git status # 删除所有Untracked files git clean -fd # 下载远程仓库的所有更新 git fetch remote # 下载远程仓库的所有更新,并且Merge git pull romote branch-name # 查看上次commit id git rev-parse HEAD # 将指定分支合并到当前分支 git merge branch-name # 将最近的一次commit打包到patch文件中 git format-patch HEAD^ # 将patch文件 添加到本地仓库 git am patch-file # 查看指定文件修改历史 git blame file-name
Git常用命令
git clone
# 将远程git仓库克隆到本地 git clone url # 将远程git仓库克隆到本地 git clone -b branch url
git stash
# 将修改过,未add到Staging区的文件,暂时存储起来 git stash # 恢复之前stash存储的内容 git stash apply # 保存stash 并写message git stash save "stash test" # 查看stash了哪些存储 git stash list # 将stash@{1}存储的内容还原到工作区 git stash apply stash@{1} # 删除stash@{1}存储的内容 git stash drop stash@{1} # 删除所有缓存的stash git stash clear
git config
# 配置git图形界面编码为utf-8 git config --global gui.encoding=utf-8 # 设置全局提交代码的用户名 git config --global user.name name # 设置全局提交代码时的邮箱 git config --global user.email email # 设置当前项目提交代码的用户名 git config user.name name
git remote
# 显示所有远程仓库 git remote -v # 增加一个新的远程仓库 git remote add name url # 删除指定远程仓库 git remote remove name # 获取指定远程仓库的详细信息 git remote show origin
git add
# 添加所有的修改到Staging区 git add . git add --all # 添加指定文件到Staging区 git add file # 添加多个修改的文件到Staging区 git add file1 file2 # 添加修改的目录到Staging区 git add dir # 添加所有src目录下main开头的所有文件到Staging区 git add src/main*
git commit
# 提交Staging区的代码到本地仓库区 git commit -m "message" # 提交Staging中在指定文件到本地仓库区 git commit file1 file2 -m "message" # 使用新的一次commit,来覆盖上一次commit git commit --amend -m "message" # 修改上次提交的用户名和邮箱 git commit --amend --author="name" --no-edit
git branch
# 列出本地所有分支 git branch # 列出本地所有分支 并显示最后一次提交的哈希值 git branch -v # 在-v 的基础上 并且显示上游分支的名字 git branch -vv # 列出上游所有分支 git branch -r # 新建一个分支,但依然停留在当前分支 git branch branch-name # 删除分支 git branch -d branch-name # 设置分支上游 git branch --set-upstream-to origin/master # 本地分支重命名 git branch -m old-branch new-branch
git checkout
# 创建本地分支并关联远程分支 git checkout -b local-branch origin/remote-branch # 新建一个分支,且切换到新分支 git checkout -b branch-name # 切换到另一个分支 git checkout branch-name # 撤销工作区文件的修改,跟上次Commit一样 git checkout commit-file
git tag
# 创建带有说明的标签 git tag -a v1.4 -m 'my version 1.4' # 打标签 git tag tag-name # 查看所有标签 git tag # 给指定commit打标签 git tag tag-name commit-id # 删除标签 git tag -d tag-name
git push
# 删除远程分支 git push origin :master # 删除远程标签 git push origin --delete tag tag-name # 上传本地仓库到远程分支 git push remote branch-name # 强行推送当前分支到远程分支 git push remote branch-name --force # 推送所有分支到远程仓库 git push remote --all # 推送所有标签 git push --tags # 推送指定标签 git push origin tag-name # 删除远程标签(需要先删除本地标签) git push origin :refs/tags/tag-name # 将本地dev分支push到远程master分支 git push origin dev:master
git reset
# 将未commit的文件移出Staging区 git reset HEAD # 重置Staging区与上次commit的一样 git reset --hard # 重置Commit代码和远程分支代码一样 git reset --hard origin/master # 回退到上个commit git reset --hard HEAD^ # 回退到前3次提交之前,以此类推,回退到n次提交之前 git reset --hard HEAD~3 回退到指定commit git reset --hard commit-id
git diff
# 查看文件在工作区和暂存区区别 git diff file-name # 查看暂存区和本地仓库区别 git diff --cached file-name # 查看文件和另一个分支的区别 git diff branch-name file-name # 查看两次提交的区别 git diff commit-id commit-id
git show
# 查看指定标签的提交信息 git show tag-name # 查看具体的某次改动 git show commit-id
git log
# 指定文件夹 log git log --pretty=format:"%h %cn %s %cd" --author="iisheng\|胜哥" --date=short src # 查看指定用户指定format 提交 git log --pretty=format:"%h %cn %s %cd" --author=iisheng --date=short # 查看该文件的改动历史 git log --pretty=oneline file # 图形化查看历史提交 git log --graph --pretty=oneline --abbrev-commit # 统计仓库提交排名前5 git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 # 查看指定用户添加代码行数,和删除代码行数 git log --author="iisheng" --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 } END { printf "added lines: %s removed lines : %s \n",add,subs }'
git rebase
# 将指定分支合并到当前分支 git rebase branch-name # 执行commit id 将rebase 停留在指定commit 处 git rebase -i commit-id # 执行commit id 将rebase 停留在 项目首次commit处 git rebase -i --root
git restore
# 恢复第一次add 的文件,同 git rm --cached git restore --staged file # 移除staging区的文件,同 git checkout git restore file
git revert
# 撤销前一次commit git revert HEAD # 撤销前前一次commit git revert HEAD^ # 撤销指定某次commit git revert commit-id
Git骚操作
Git命令不能自动补全?(Mac版)
我见过有的人使用Git
别名,反正因为有自动补全的存在,我从来没用过Git
别名。不过我的确将我的rm -rf
命令替换成了别的脚本了...
安装bash-completion
brew install bash-completion
添加 bash-completion 到 ~/.bash_profile
:
if [ -f $(brew --prefix)/etc/bash_completion ]; then . $(brew --prefix)/etc/bash_completion fi
shell
有不同种类,我这里使用的是bash
。
代码没写完,突然要切换到别的分支怎么办?
暂存未提交的代码
git stash
还原暂存的代码
git stash apply
怎么合并其他分支的指定Commit?
使用cherry-pick
命令
git cherry-pick 指定commit-id
本地临时代码不想提交,怎么一次性清空?
还原未commit
的本地更改的代码
git reset --hard
还原包含commit
的代码,到跟远程分支相同
git reset --hard origin/master
已经提交的代码,不需要了,怎么当做没提交过?
还原到上次commit
git reset --hard HEAD^
还原到当前之前的几次commit
git reset --hard HEAD~2
强制推送到远程分支,确保没有其他人在push
,不然可能会丢失代码
git push origin develop --force
历史commit作者邮箱写错了,怎么一次性改过来?
使用git filter-branch
命令。
复制下面的脚本,替换相关变量
OLD_EMAIL
CORRECT_NAME
CORRECT_EMAIL
脚本如下:
#!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="your-old-email@example.com" CORRECT_NAME="Your Correct Name" CORRECT_EMAIL="your-correct-email@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags
强制推送替换
git push --force --tags origin 'refs/heads/*'
不小心把不该提交的文件commit了,怎么永久删除?
也是使用git filter-branch
命令。
git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch FILE-PATH-AND-NAME" \ --prune-empty --tag-name-filter cat -- --all
强制推送覆盖远程分支。
git push origin --force --all
强制推送覆盖远程tag
。
git push origin --force --tags
怎么保证团队成员提交的代码都是可运行的?
这里想说的是使用git hooks
,一般在项目目录.git/hooks
,客户端可以使用hooks
,控制团队commit
提交规范,或者push
之前,自动编译项目校验项目可运行。服务端可以使用hooks
,控制push之后自动构建项目,merge
等自动触发单元测试等。
git reset --hard
命令,执行错了,能恢复吗?
查看当前commit log
误操作git reset --hard 8529cb7
执行git reflog
还原到之前的样子
提示:
本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- 详解IDEA git分支回退指定的历史版本_相关技巧_
- 详解IDEA Git Reset 选项说明_相关技巧_
- 详解git reset --hard 和 git reset --soft区别_相关技巧_
- 搭建一个开源项目两种方式安装git的详细教程_相关技巧_
- 详解git reset 加不加 --hard的区别_相关技巧_
- 如何巧用vimdiff来替代原始的svn diff和git diff(效率提升)_相关技巧_
- Git恢复之前版本的两种方法reset、revert(图文详解)_相关技巧_
- idea+git合并分支解决冲突及详解步骤_相关技巧_
- Git分支合并冲突解决的方法实现_相关技巧_
- git rebase -i合并多次提交的实现_相关技巧_