git必需基本操作指令

●git ——显示分支一览表
补充:git 命令可以将分支名列表显示,同时可以确认当前所在分支 。
●git-b——创建、切换分支
补充:如果想以当前的 分支为基础创建新的分支,我们需要用到git-b命令 。
执行下面的命令,创建名为-A 的分支并切换至-A分支 。
$ git checkout -b feature-A
实际上,连续执行下面两条命令也能收到同样效果 。
$ git branch feature-A$ git checkout feature-A
●切换到 分支
$ git checkout master
●切换回上一个分支
$ git checkout -
补充:像上面这样用“-”(连字符)代替分支名,就可以切换至上一个分支 。当然,将“-”替换成-A 同样可以切换到-A 分支
●git merge——合并分支
补充:我们假设-A 已经实现完毕,想要将它合并到主干分支 中 。首先切换到 分支 。
$ git checkout masterSwitched to branch 'master'
然后合并-A 分支 。为了在历史记录中明确记录下本次分支合并,我们需要创建合并提交 。因此,在合并时加上--no-ff参数 。
$ git merge --no-ff feature-A
随后编辑器会启动,用于录入合并提交的信息
Merge branch 'feature-A'# Please enter a commit message to explain why this merge is necessary,# especially if it merges an updated upstream into a topic branch.## Lines starting with '#' will be ignored, and an empty message aborts# the commit.
默认信息中已经包含了是从-A 分支合并过来的相关内容,所以可不必做任何更改 。将编辑器中显示的内容保存,关闭编辑
类似vi编辑命令中使用
首先使用esc(键退出)->:(符号输入)->wq(保存退出)
:wq(保存编辑操作退出):wq!(保存编辑强制退出)
●git log --graph——以图表形式查看分支
补充:git log --graph命令可以用图表形式输出提交日志,非常直观,请大家务必记住 。
$ git log --graph
●git reset——回溯历史版本
补充:比如我们前面已经有了-A分支,并且提交了主干,那么回溯历史版本到没有-A分支的提交,然后创建一个名为fix-B 的特性分支

git必需基本操作指令

文章插图
查看操作日志,找到对应的标时间点的哈希值
git reflog
要让仓库的HEAD、暂存区、当前工作树回溯到指定状态,需要用到git rest --hard命令
$ git reset --hard fd0cbf0d4a25f747230694d95cac1be72d33441dHEAD is now at fd0cbf0 Add index
我们已经成功回溯到特性分支(-A)创建之前的状态 。由于所有文件都回溯到了指定哈希值对应的时间点上,文件的内容也恢复到了当时的状态 。
现在我们来创建特性分支(fix-B)
git必需基本操作指令

文章插图
$ git checkout -b fix-BSwitched to a new branch 'fix-B'
推进至-A 分支合并后的状态,首先恢复到-A 分支合并后的状态 。不妨称这一操作为“推进历史” 。
git log命令只能查看以当前状态为终点的历史日志 。所以这里要使用git 命令,查看当前仓库的操作日志 。
在日志中找出回溯历史之前的哈希值,通过git reset --hard命令恢复到回溯历史前的状态 。
首先执行git命令,查看当前仓库执行过的操作的日志 。
$ git reflog4096d9e HEAD@{0}: commit: Fix Bfd0cbf0 HEAD@{1}: checkout: moving from master to fix-Bfd0cbf0 HEAD@{2}: reset: moving to fd0cbf0d4a25f747230694d95cac1be72d33441d83b0b94 HEAD@{3}: merge feature-A: Merge made by the 'recursive' strategy.fd0cbf0 HEAD@{4}: checkout: moving from feature-A to master8a6c8b9 HEAD@{5}: checkout: moving from master to feature-Afd0cbf0 HEAD@{6}: checkout: moving from feature-A to master8a6c8b9 HEAD@{7}: commit: Add feature-Afd0cbf0 HEAD@{8}: checkout: moving from master to feature-Afd0cbf0 HEAD@{9}: commit: Add index9f129ba HEAD@{10}: commit (initial): First commit
从上面数第四行表示-A 特性分支合并后的状态,对应哈希值为 。我们将HEAD、暂存区、工作树恢复到这个时间点的状态
$ git checkout master$ git reset --hard 83b0b94HEAD is now at 83b0b94 Merge branch 'feature-A'
git必需基本操作指令

文章插图
现在只要合并fix-B 分支,就可以得到我们想要的状态
$ git merge --no-ff fix-BAuto-merging README.mdCONFLICT (content): Merge conflict in README.mdRecorded preimage for 'README.md'Automatic merge failed; fix conflicts and then commit the result.
这时,系统告诉我们.md 文件发生了冲突() 。
系统在合并.md 文件时,-A 分支更改的部分与本次想要合并的fix-B 分支更改的部分发生了冲突 。
不解决冲突就无法完成合并,所以我们打开.md 文件,解决这个冲突 。然后再进行提交,冲突解决后,执行git add命令与git 命令 。
●git--amend——修改提交信息
补充:要修改上一条提交信息,可以使用git--amend命令
$ git commit --amend
然后保存编辑并提交即可(ESC->:wq)
随后会显示上面这条结果 。现在执行git log --graph命令,可以看到提交日志中的相应内容也已经被修改
$ git log --graph* commit 2e7db6fb0b576e9946965ea680e4834ee889c9d8|\ Merge: 83b0b94 4096d9e| | Author: hirocaster | | Date: Sun May 5 16:58:27 2013 +0900| || | Merge branch 'fix-B'| || * commit 4096d9e856995a1aafa982aabb52bfc0da656b74| | Author: hirocaster | | Date: Sun May 5 16:50:31 2013 +0900| || | Fix B| |* | commit 83b0b94268675cb715ac6c8a5bc1965938c15f62|\ \ Merge: fd0cbf0 8a6c8b9| |/ Author: hirocaster |/| Date: Sun May 5 16:37:57 2013 +0900| || | Merge branch 'feature-A'| || * commit 8a6c8b97c8962cd44afb69c65f26d6e1a6c088d8|/ Author: hirocaster | Date: Sun May 5 16:22:02 2013 +0900|| Add feature-A|* commit fd0cbf0d4a25f747230694d95cac1be72d33441d| Author: hirocaster | Date: Sun May 5 16:10:15 2013 +0900|| Add index|* commit 9f129bae19b2c82fb4e98cde5890e52a6c546922Author: hirocaster Date: Sun May 5 16:06:49 2013 +0900First commit
●git-i——压缩历史
补充:在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,
不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个
历史记录 。这是个会经常用到的技巧,让我们来实际操作体会一下;HEAD~表示上一次提交的,HEAD~2表示上两次提交的...以此类推
$ git rebase -i HEAD~2
用上述方式执行git 命令,可以选定当前分支中包含HEAD(最新提交)在内的两个最新历史记录为对象,并在编辑器中打开
pick 7a34294 Add feature-Cpick 6fba227 Fix typo# Rebase 2e7db6f..6fba227 onto 2e7db6f## Commands:# p, pick = use commit# r, reword = use commit, but edit the commit message# e, edit = use commit, but stop for amending# s, squash = use commit, but meld into previous commit# f, fixup = like "squash", but discard this commit's log message# x, exec = run command (the rest of the line) using shell## These lines can be re-ordered; they are executed from top to bottom.## If you remove a line here THAT COMMIT WILL BE LOST.## However, if you remove everything, the rebase will be aborted.## Note that empty commits are commented out
我们将 的Fix typo 的历史记录压缩到 的Add -C里 。按照下图所示,将 左侧的pick 部分删除,改写为fixup,保存编辑器里的内容,关闭编辑器
pick 7a34294 Add feature-Cfixup 6fba227 Fix typo[detached HEAD 51440c5] Add feature-C1 file changed, 1 insertion(+)Successfully rebased and updated refs/heads/feature-C.
现在再查看提交日志时会发现Add -C 的哈希值已经不是 了,这证明提交已经被更改
$ git log --graph
推送至远程仓库
在上新建一个仓库
●gitadd——添加远程仓库
补充:在 上创建的仓库路径为“用户名/仓库名.git”(类似这样) 。现在我们用gitadd命令将它设置成本地仓库的远程仓库
$ git remote add origin https://github.com/city85/git-learn.git
按照上述格式执行gitadd命令之后,Git 会自动将远程仓库的名称设置为(标识符) 。
●git push——推送至远程仓库
补充:如果想将当前分支下本地仓库中的内容推送给远程仓库,需要用到git push命令 。现在假定我们在 分支下进行操作
git push -u origin master
像这样执行git push命令,当前分支的内容就会被推送给远程仓库 的 分支 。
-u参数可以在推送的同时,将 仓库的 分支设置为本地仓库当前分支的(上游) 。
添加了这个参数,将来运行git pull命令从远程仓库获取内容时,
本地仓库的这个分支就可以直接从 的 分支获取内容,
省去了另外添加参数的麻烦 。执行该操作后,当前本地仓库 分支的内容将会被推送到 的远程仓库中
推送至 以外的分支
除了 分支之外,远程仓库也可以创建其他分支 。举个例子,我们在本地仓库中创建-D 分支,并将它以同名形式push 至远程仓库 。
$ git checkout -b feature-DSwitched to a new branch 'feature-D'
我们在本地仓库中创建了-D 分支,现在将它push 给远程仓库并保持分支名称不变 。
$ git push -u origin feature-DTotal 0 (delta 0), reused 0 (delta 0)
从远程仓库获取
●git clone——获取远程仓库
补充:首先我们换到其他目录下,将 上的仓库clone 到本地 。注意不要与之前操作的仓库在同一目录下 。
$ git clone https://github.com/city85/git-learn.git
执行git clone命令后我们会默认处于 分支下,同时系统会自动将 设置成该远程仓库的标识符 。也就是说,当前本地仓库的 分支与 端远程仓库()的 分支在内容上是完全相同的
●git-a——查看当前分支的相关信息
补充:添加-a参数可以同时显示本地仓库和远程仓库的分支信息
$ git branch -a
●获取远程的-D 分支
补充:我们试着将-D 分支获取至本地仓库 。
-b 参数的后面是本地仓库中新建分支的名称 。为了便于理解,
我们仍将其命名为-D,让它与远程仓库的对应分支保持同名 。
新建分支名称后面是获取来源的分支名称 。例子中指定了/-D,
就是说以名为 的仓库(这里指 端的仓库)的-D 分支为来源,在本地仓库中创建-D 分支
$ git checkout -b feature-D origin/feature-D
●向本地的-D 分支提交更改
补充:-am 直接添加并提交
$ git commit -am "Add feature-D"
●推送-D 分支
$ git push
●git pull——获取最新的远程仓库分支
$ git pull origin feature-D
【git必需基本操作指令】补充:如果两人同时修改了同一部分的源代码,push 时就很容易发生冲突 。所以多名开发者在同一个分支中进行作业时,为减少冲突情况的发生,建议更频繁地进行push 和pull 操作