Git科普文,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=“[email protected]
CORRECT_NAME=“Your Correct Name”
CORRECT_EMAIL=“[email protected]

if [ “ G I T C O M M I T T E R E M A I L " = " GIT_COMMITTER_EMAIL" = " OLD_EMAIL” ]
then
export GIT_COMMITTER_NAME=“ C O R R E C T N A M E " e x p o r t G I T C O M M I T T E R E M A I L = " CORRECT_NAME" export GIT_COMMITTER_EMAIL=" CORRECT_EMAIL”
fi
if [ “ G I T A U T H O R E M A I L " = " GIT_AUTHOR_EMAIL" = " OLD_EMAIL” ]
then
export GIT_AUTHOR_NAME=“ C O R R E C T N A M E " e x p o r t G I T A U T H O R E M A I L = " 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

还原到之前的样子

公司使用GitLab,平时还用GitHub,多账号SSH,如何配置?
编辑 ~/.ssh/config文件 没有就创建

github

Host github.com
Port 22
HostName github.com
PreferredAuthentications publickey
AddKeysToAgent yes
IdentityFile ~/.ssh/github_id_rsa
UseKeychain yes
User iisheng

gitlab

Host gitlab.iisheng.cn
Port 22
HostName gitlab.iisheng.cn
PreferredAuthentications publickey
AddKeysToAgent yes
IdentityFile ~/.ssh/gitlab_id_rsa
UseKeychain yes
User iisheng
Git commits历史如何变得清爽起来?
多用git rebase。

比如,开发分支是feature,主干分支是master。我们在进行代码合并的时候,可以执行下面的命令。

切换当前分支到feature

git checkout feature

将当前分支代码变基为基于master

git rebase master
然后我们再切换到master分支,执行git merge feature,就可以进行快进式合并了,commmits历史就不会有交叉了。后文我们会详细讲解。

git rebase会更改commit历史,请谨慎使用。

下面的图是Guava项目的commit记录。

如何修改已经提交的commit信息?
原始Git提交记录是这样的

执行git rebase -i 070943d,对指定commitId之前的提交,进行修改

修改后Git提交记录变成了这样

git rebase -i非常实用,还可以将多个commit合并成一个等很多事情,务必要记下。

不小心执行了git stash clear怎么办?
git fsck --lost-found
执行之后,可以找到相关丢失的commit-id,然后merge一下即可。

该命令上可以找回git add之后被弄丢的文件。

啥?你没执行过git add代码就丢了?别怕,一般编译器有Local History赶紧去试试吧。

详解git merge
我们执行git merge命令的时候,经常会看到Fast-forward字样,Fast-forward到底是个什么东西?

其实,git merge一般有三种场景。
深圳网站建设www.sz886.com

猜你喜欢

转载自blog.csdn.net/weixin_45121123/article/details/107768225