工作目录 -> (git add) -> 暂存区 -> (git commit) -> 版本库
重新复习 git 的笔记,仅仅是记录了一些我常使用图形化工具而忘记的命
令(不是全部),以便日后查用。
git config --global user.name 'your name'
:配置用户名
git config --global user.email 'your email'
:配置邮箱
config 的三个作用域,缺省等于local:
git config --list --local
:显示config的配置
git add -u
: 将已经被git管理的文件的改动提交到暂存区.
方法1(不推荐):在工作目录直接修改文件名。
此时执行命令 git status
,结果为 :
认为是先删除了原文件,然后新增了一个新文件。现在要把新改的文件名提交到暂存区的操作是:
git add <新文件名>
git rm <原文件名>
这样才算完成重命名的操作。
add 操作完成之后执行 status 命令,git 能智能识别出这是一个重命名的操作。
方法2(推荐):
git mv <文件名> <新文件名>
mv 之后的物理磁盘上的文件名称就已经改变了,同时这次改变也被 add 到了暂存区,此时如果需要提交,只执行 commit 命令就可以了。
git log
:会把当前分支提交相关的 commit id,作者,时间,提交注释信息等都展示出来。git log --oneline
:简洁信息,一行展示出id和提交注释信息。git log -n2 --oneline
:-n2代表只看最新的两条,要看5条就是-n5git log --all
:显示所有分支的提交信息。git log --all --graph
:图形化显示所有提交历史,能清晰的表现出各个分支的演进信息。git log 分支名
:查看制定分支的提交记录以上这些命令关键字都是可以组合使用的。
比方说你想把某个分支张三的某次提交合并进master分支,此时author就是张三,committer就是你。
指的是某些变更没有基于任何一个 branch ,所以当你进行分支切换时,在分离头指针的情况下的commit很有可能会丢失。此时.git/HEAD
文件指向的是某个 commit id
,而不是分支。
会造成分离头指针的情况,比如:git checkout
此时如果在当前情况下作了 commit,继后切换到其它分支,git log 是查看不到在分离头指针情况下作的任何 commit。(ps:当在分离头指针情况下切换到其它分支时,git 会提示将修改保存至某个分支)
git commit --amend
仅限于对自己的分支或本地分支更改,如果分支已经也被其它同事使用,则谨慎操作,可能会对其它同事造成影响。
例如我们现在想把红框内的内容改成 change something,则需要用到变基(rebase)命令,我们要修改的是b commit,那么它的基就是a commit,所以变基命令要操作的对象就应该是a commit:
git rebase -i 015f8bc2c1dc
,操作基的commit id。
之后会弹出一个交互信息:
仔细阅读注释内信息得知,我们需要的操作的reword,应用操作,但是修改 commit message:
保存退出。然后git会自动弹出另一个交互界面:
此时修改 message 为你需要的信息,然后保存退出即可。
仔细观察发现基之后的commit id 全部发生了改变,所以次操作不适合在已经与同事共用的分支上操作。
仅限于对自己的分支或本地分支更改,如果分支已经也被其它同事使用,则谨慎操作,可能会对其它同事造成影响。
要用到 git 的变基命令,要合并的是b和c,那它们的基是a:
git rebase -i 135633609e750
,操作基的commit id。
敲入命令回车,自动弹出如下界面:
看注释发现我们需要的命令是 squash:
保存退出。然后自动弹出另一个窗口:
合并成功:
此操作会导致合并的 commit 和该条之后的 commit 的 id 都会改变,所以还是建议只在自己的分支或者本地分支进行操作,以免影响到其他同事。
就是暂存区和当前分支最新的以此commit之间的差异。
git diff --cached
git diff --
: 不加 – filename 就默认所有。
git reset HEAD -- <文件名>...
就是取消暂存
比如说add了某些代码,然后在本地改动这部分代码发现更好的实现方式,则可以将暂存区取消,add 新的代码。
git checkout --
git reset --hard
:即把工作区和暂存区恢复到某个commit的状态。
git rm filename
执行完工作区的文件就被删了,然后暂存区有了一条deleted的记录。
场景:开发中临时加塞了其它任务
git stash
:将当前工作区和暂存区的内容全部暂存起来,恢复到和HEAD一样的状态。
git stash apply
:将 stash 栈顶的内容应用到当前,栈顶内容不弹出。
git stash pop
:将 stash 栈顶的内容应用到当前,栈顶内容弹出。
先检查电脑是不是已经生成过公私钥信息,如果已经生成过直接用就行。
具体操作参考 github help 页:https://help.github.com/en/github/authenticating-to-github/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
git remote -v
:列出远程仓库的信息。
git remote add <自己设置一个远程主机名>
,添加一个远程仓库关联,比如git remote add gitee-git-learn [email protected]:xxx/xxx.git
git push
git push -u <主机名> <分支名>
如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
参考:https://www.cnblogs.com/qianqiannian/p/6008140.html
fetch是单纯地把远程分支拉到本地;pull则在把远程分支拉到本地之外,还将对应分支做了一个 merge 操作。
上图是只fetch操作的情况,该远程分支生成了一个新树,没有和其它分支树关联。
然后 merge 一下看看,
报错拒绝合并不相关的历史,因为我们看fetch时的图,的确是两个不相关的树。
git merge -h
找到我们需要用的参数:
--allow-unrelated-histories
:允许不相关的历史合并。键入命令后回车弹出窗口输入合并原因(一般缺省值就可以),合并完成。
git checkout -b <本地分支名> <远端分支名>
:基于远端分支创建一个本地分支,并切换到该分支。
场景:
用户A把index.html改成了index1.html;
用户B把index.html改成了index2.html并且先一步先一步提交了;
此时用户A提交报错,因为本地不是fast-forward,需要先pull;
pull之后提示冲突:
并且工作区间出现两个文件:
此时git status 如下:
和同事协商后文件名改为index1.htm,依照提示进行如下操作:
git rm index.htm
git rm index2.htm
git add index1.htm
git commit ...
// 及时的推送到远端
git push ...
XaRcRQ-1585799240050)]
此时git status 如下:
[外链图片转存中…(img-SldcbhQ9-1585799240051)]
和同事协商后文件名改为index1.htm,依照提示进行如下操作:
git rm index.htm
git rm index2.htm
git add index1.htm
git commit ...
// 及时的推送到远端
git push ...