1. 分支操作
1.1 查看本地所有分支
git branch
被
*
标识的分支就是当前代码所在的分支,图示表明当前在develop
分支。
1.2 查看所有分支(包含本地+远程仓库)
git branch -a
1.3 切换分支
git checkout test
切换到本地的test分支。
git checkout origin master
: 切换到远程仓库的master分支。
2. 常用基本操作
2.1 查看 git
各存储区内(文件)状态
git status
2.2 查看工作区与暂存区文件差异
git diff
git diff
命令还可以通过指定HEAD指针、版本、文件名等进行更具体的比较。
2.3 临时存储/取消临时存储
有时,在开发过程中,需要切换分支改BUG,但是当前功能又没开发完,也不适合提交,此时就可以将当前修改临时存储起来,切换分支后再去改BUG。
git stash
我们先使用git status
看下git各区域的变更状态:
然后,我们执行git stash
命令后再执行git status
观察下git各区域变更状态:
可以看到,差异只是在工作区,git stash
命令,将工作区的修改隐藏了,临时存储在一个特殊容器里面。
git stash pop
git stash pop
命令取消git stash
操作,将隐藏的对工作区内的修改进行复原。
2.4 查看 git
记录
git log
输入git log
命令会进入一个git提交记录显示窗口,可以上下翻页查找,输入q
退出。
git log --oneline
跟上面的功能一样,只是显示的信息更加的简约、紧凑,我个人更喜欢这样用。
3. 撤销操作
3.1 撤销add
git reset <fileName>
撤销已经从工作区添加到暂存区,但是还没commit的文件。
我们可以看到,执行git reset
命令之后,已经add的文件又从暂存区回到了工作区。
我们也可以执行git reset .
取消所有在暂存区文件的add操作。
3.2 撤销commit
git reset --soft HEAD^
撤销commit操作,但是不撤销add操作。
可以看到,执行完git reset --soft HEAD^
命令之后,已提交的修改回到了暂存区。
git reset --mixed HEAD^
撤销commit操作,同时撤销add操作,但是将修改保留在工作区。
可以看到,执行完git reset --mixed HEAD^
命令之后,已提交的修改回到了工作区。
git reset --hard HEAD^
撤销commit操作,并撤销add操作,同时工作区也不保留修改。
可以看到,执行完git reset --hard HEAD^
命令之后,已提交的修改没了,最新的commit也没了。
git reset --hard HEAD~n
撤销最近n次的commit操作,并撤销add操作,同时工作区也不保留修改。
可以根据我们的需求选择--hard
, --soft
或者 --mixed
选项,下面我们以n取2为例。
可以看到,执行完该命令后,我们提交的最新的2个commit完全消失了。
3.3 撤销push到远程仓库的commit
撤销push到远程仓库的commit的操作可分为以下3步:
3.3.1 先确定要取消的commit
git log --oneline
确定哪几个commit需要取消。
现在我要取消最新的2个commit,让commit哈希值为bd04cbb
的commit成为最新的commit。
3.3.2 取消本地仓库commit
git reset --soft <commitId>
我们的commitId值取上一步确定的值,执行命令,结果如下。可以看到最新的2个commit记录没了。
根据我们的需求,
--soft
选项也可以换成--hard
或者--mixed
,具体区别见3.2.
3.3.3 将本地仓库的更改同步到远程仓
git push origin <branchName>
此处branchName选择本地分支对应的远端分支,将对本地仓内该分支的修改同步到远程仓库。
--force
选项也可以直接简写成-f
4. 合并 commit
4.1 确定要合并的commit的前一个commitId 值
使用git log --oneline
确定那些commit需要合并,我们这里要合并前2个commit。因此,我们要取第3个commitID为bd04cbb
的值。
4.2 执行 git rebase -i <commitId>
命令
这里的 <commitId>
为上一步确定的 bd04cbb
。
执行完该命令进入到一个vim编辑界面:
在前面未注释的部分的行首,我们只保留第一行的pick,其他行都改为s(代表squash,表示对应的commit被压缩)。退出编辑模式,输入wq!
保存退出。进入另一个vim 编辑框如下。该编辑框的内容为要合并的所有commit的message,我们现在需要将所有的commit message合并为一个。
修改如下后保存退出。
4.3 执行 git log
命令查看commit合并情况
此时我们使用git log
命令查看可以看到原来的2个commit已经被合并为一个新的commit。
5. 将已提交的commit修改复制到另一个分支上
我们在上一步在 test
分支提交了一个 commit(添加注释)。
此时我们切换到了 develop
分支上,现在我们要把在 test
分支上的改动,复制到 develop
分支上,此时我们就需要使用 cherry-pick
命令。
5.1 使用 cherry-pick
复制单个commit
git cherry-pick <commitId>
我们当前在 develop 分支上,对test分支上的commitId 为e5ac3d4
的commit 进行 cherry-pick
。
我们从上图可以看到,其它分支上的修改被复制了过来,在develop分支上产生的新commit有新的commitId。
5.2 使用 cherry-pick
复制多个commit
git cherry-pick <commitId1> <commitId2> ...
我们现在在develop分支上,想把该分支上最新的2个commit复制到test分支上(3个及以上个commit也是同理)。
先切换到test分支上,在test分支上执行命令git cherry-pick a313ca3 9b2284e
。
此时,我们再来看下commit 日志,看到多个commit已经被复制到test分支:
6. Git 的认证问题
背景:在我们同时处理多个项目的场景下,如果我们的项目使用了不同的 Git平台托管代码,或者多个项目对应多个不同的账号密码,我们在提交代码可能会失败(将commit push到远程时)。我遇到的情况是:因为Git Bash之类的Git客户端会缓存我们的认证凭证信息(像账号密码),我们多个项目有需要不同的账号密码的情况,就可能导致 push 代码到远程仓库失败。
使用如下命令,在每次与远程仓库交互时都重新输入账号密码,可解决因为认证导致的 push 失败的问题:
git config --system --unset credential.helper
这样的话,我们每次执行git pull
、git push
、git fetch
之类的命令时就都需要重新输入账号密码。这样也很麻烦!!!
我们可以在执行完上述命令之后,会重新输入账号密码,我们输完账号密码之后执行下面命令:
git config --global credential.helper store
上面命令是设置git 客户端继续缓存用户认证信息。等我们需要重新操作另一个项目时可以再执行第一条命令。