Git图片
一、快速上手Git命令
- 拉取远程仓库到本地:
git clone
地址 [重命名] - 查看提交历史:
git log
- 查看工作目录当前状态:
git status
- 暂存文件/开始追踪文件:
git add
文件路径- add 后加个“.”,全部暂存
- add 添加的是文件改动,而不是文件名
- 提交文件到本地仓库:
git commit
- 本地提交发布到中央仓库:
git push
- 保存密码:
git config credential.helper store
- 拉取最新的代码:
git pull
- 查看具体的commit:
git show
[sha1码] [文件名]
小结
在这一节里,描述了 Git 的最基本的工作模型:
- 从 GitHub 把中央仓库 clone 到本地(使用命令:
git clone
) - 把写完的代码提交(先用
git add 文件名
把文件添加到暂存区,再用git commit
提交)- 在这个过程中,可以使用
git status
来随时查看工作目录的状态 - 每个文件有 “changed / unstaged”(已修改), “staged”(已修改并暂存), “commited”(已提交) 三种状态,以及一种特殊状态 “untracked”(未跟踪)
- 在这个过程中,可以使用
- 提交一次或多次之后,把本地提交
push
到中央仓库(git push
)
二、branch的创建、切换和删除
- 创建branch:git branch 分支名字
- 切换branch:git checkout 分支名字
- 可以使用:git checkout -b 分支名字来代替上两步
- 删除branch:git branch -d 分支名字
- 注意:HEAD指向的branch不能删除,如果要删除,需要先切换HEAD到其他分支
- 将-d改为-D,就可以强制删除不能删除的branch
小结(1)
这一节介绍了 Git 中的一些「引用」:HEAD
、master
、branch
。这里总结一下:
HEAD
是指向当前commit
的引用,它具有唯一性,每个仓库中只有一个HEAD
。在每次提交时它都会自动向前移动到最新的commit
。branch
是一类引用。HEAD
除了直接指向commit
,也可以通过指向某个branch
来间接指向commit
。当HEAD
指向一个branch
时,commit
发生时,HEAD
会带着它所指向的branch
一起移动。master
是 Git 中的默认branch
,它和其它branch
的区别在于:- 新建的仓库中的第一个
commit
会被master
自动指向; - 在
git clone
时,会自动checkout
出master
。
- 新建的仓库中的第一个
branch
的创建、切换和删除:- 创建
branch
的方式是git branch 名称
或git checkout -b 名称
(创建后自动切换); - 切换的方式是
git checkout 名称
; - 删除的方式是
git branch -d 名称
。
- 创建
小结(2)
这一节介绍了 push
这个指令的本质。总结一下关键点:
push
是把当前的分支上传到远程仓库,并把这个branch
的路径上的所有commit
s 也一并上传。push
的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用git push origin branch_name
的格式,而不能只用git push
;或者可以通过git config
修改push.default
来改变push
时的行为逻辑。push
的时候之后上传当前分支,并不会上传HEAD
;远程仓库的HEAD
是永远指向默认分支(即master
)的。
三、合并
命令
合并分支:git merge 分支名字
取消合并:git merge –abort
小结
本节对 merge
进行了介绍,内容大概有这么几点:
merge
的含义:从两个commit
「分叉」的位置起,把目标commit
的内容应用到当前commit
(HEAD
所指向的commit
),并生成一个新的commit
;merge
的适用场景:- 单独开发的
branch
用完了以后,合并回原先的branch
; git pull
的内部自动操作。
- 单独开发的
merge
的三种特殊情况:- 冲突
- 原因:当前分支和目标分支修改了同一部分内容,Git 无法确定应该怎样合并;
- 应对方法:解决冲突后手动
commit
。
HEAD
领先于目标commit
:Git 什么也不做,空操作;HEAD
落后于目标commit
:fast-forward。
- 冲突
四、Feature Branching:最流行的工作流
流程
- 新建一个分支:git checkout -b 分支名字
- 提交到中心仓库:git push origin 分支名字
- 同事审核代码
- git pull
- git checkout 分支名字
- 审核通过
- git checkout master
- git pull
- git merge 分支名字
- 合并之后的结果push到中央仓库
- git push
- git branch -d 分支名字
- git push origin -d 分支名字
小结
这一节介绍了 Feature Branching 这种工作流。它的概念很简单:
- 每个新功能都新建一个
branch
来写; - 写完以后,把代码分享给同事看;写的过程中,也可以分享给同事讨论。另外,借助 GitHub 等服务提供方的 Pull Request 功能,可以让代码分享变得更加方便;
- 分支确定可以合并后,把分支合并到
master
,并删除分支。
这种工作流由于功能强大,而且概念和使用方式都很简单,所以很受欢迎。再加上 GitHub 等平台提供了 Pull Request 的支持,目前这种工作流是商业项目开发中最为流行的工作流。
五、看看改了什么
- 查看历史中的多个
commit
:log
- 查看详细改动:
git log -p
- 查看大致改动:
git log --stat
- 查看详细改动:
- 查看具体某个
commit
:show
- 要看最新
commit
,直接输入git show
;要看指定commit
,输入git show commit的引用或SHA-1
- 如果还要指定文件,在
git show
的最后加上文件名
- 要看最新
- 查看未提交的内容:
diff
- 查看暂存区和上一条
commit
的区别:git diff --staged
(或--cached
) - 查看工作目录和暂存区的区别:
git diff
不加选项参数 - 查看工作目录和上一条
commit
的区别:git diff HEAD
- 查看暂存区和上一条
六、rebase——在新位置重新提交
rebase
的意思是,给你的 commit
序列重新设置基础点(也就是父 commit
)。展开来说就是,把你指定的 commit
以及它所在的 commit
串,以指定的目标 commit
为基础,依次重新提交一次。
git rebase -i HEAD~2
可以用来实现合并本地多次请求,将pick改成s
小结(3)
本节介绍的是 rebase
指令,它可以改变 commit
序列的基础点。它的使用方式很简单:git rebase
目标基础点
需要说明的是,rebase
是站在需要被 rebase
的 commit
上进行操作,这点和 merge
是不同的。
七、提交的代码写错怎么办
怎么修复?
当场再写一个修复这几个错别字的 commit
?可以是可以,不过还有一个更加优雅和简单的解决方法:commit -—amend
。
“amend” 是「修正」的意思。在提交时,如果加上 --amend
参数,Git 不会在当前 commit
上增加 commit
,而是会把当前 commit
里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit
,用这个新的 commit
把当前 commit
替换掉。所以 commit --amend
做的事就是它的字面意思:对最新一条 commit
进行修正。
具体地,对于上面这个错误,你就可以把文件中的错别字修改好之后,输入:
git add 文件
git commit --amend
小结
这一节的内容只有一点:用 commit --amend
可以修复当前提交的错误。使用方式:git commit --amend
需要注意的有一点:commit --amend
并不是直接修改原 commit
的内容,而是生成一条新的 commit
。
八、丢弃最新的提交
你可以用 reset --hard
来撤销这条 commit
。git reset --hard HEAD^
HEAD 表示 HEAD^ 往回数一个位置的
commit
说明:在 Git 中,有两个「偏移符号」:^
和~
。
^
的用法:在commit
的后面加一个或多个^
号,可以把commit
往回偏移,偏移的数量是^
的数量。例如:master^
表示master
指向的commit
之前的那个commit
;HEAD^^
表示HEAD
所指向的commit
往前数两个commit
。
~
的用法:在commit
的后面加上~
号和一个数,可以把commit
往回偏移,偏移的数量是~
号后面的数。例如:HEAD~5
表示HEAD
指向的commit
往前数 5 个commit
。
九、临时存放工作目录的改动
“stash” 这个词,和它意思比较接近的中文翻译是「藏匿」,是「把东西放在一个秘密的地方以备未来使用」的意思。在 Git 中,stash
指令可以帮你把工作目录的内容全部放在你本地的一个独立的地方,它不会被提交,也不会被删除,你把东西放起来之后就可以去做你的临时工作了,做完以后再来取走,就可以继续之前手头的事了。
具体说来,stash
的用法很简单。当你手头有一件临时工作要做,需要把工作目录暂时清理干净,那么你可以:
git stash
就这么简单,你的工作目录的改动就被清空了,所有改动都被存了起来。
然后你就可以从你当前的工作分支切到 master
去给你的同事打包了……
打完包,切回你的分支,然后:
git stash pop
你之前存储的东西就都回来了。很方便吧?
注意:没有被 track 的文件(即从来没有被 add 过的文件不会被 stash 起来,因为 Git 会忽略它们。如果想把这些文件也一起 stash,可以加上
-u
参数,它是--include-untracked
的简写。就像这样:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/15200.html