@LiTAOo
2018-06-30T08:29:35.000000Z
字数 6248
阅读 1481
Git
Github
学习笔记
目录
使用操作系统内置命令比较文件之间的差异
Windows:
FC file_name1 file_name2
Mac/Linux:
diff -u file_name1 file_name2
其中,-u
参数表示标准格式输出,可以使得对比的结果更加易读。
在Windows上安装git
点击此处浏览Git安装教程,内部含有git for Windows官网链接。
安装Sublime Text文本编辑器
Add to explorer context menu
。 Sublime Text 并不是一款免费的开源软件。相反,它是一个收费的软件。Sublime 需要你购买来使用这个软件,你可以点击官网右上角的
Buy
进行购买,购买页面也有购买的信息说明。如果你不购买的话也是可以进行基本的使用的,只是它会经常进行弹窗提醒并且编辑器上方会有UNREGISTERED
表示你没有购买,并且对于部分功能和权限会有限制。
完成购买之后可以看到编辑器上面将不会有没有购买的说明,并且也不会一直有弹窗提醒你购买。
在Windows上设置Git工作空间
设置Git工作空间是指对Git进行配置,使其更加人性化并且易于使用。
配置的主要内容包括:
自定义提示
表现为将git提示栏中的用户名设置为紫色,将当前所在目录设置为蓝色,将git当前检出的commit信息设置为绿色等。
Tab自动填充
在git bash中输入命令时,只需输入命令的开头部分,按下Tab
键git bash即可将命令自动补全。
为git bash配置文本编辑器
使得在git bash中,使用命令subl
+filename
即可自动调用sublime,且在进行git commit时,如果没有指定-m
参数,则也会默认打开sublime进行信息填写。
快速复制粘贴操作
在git bash中,ctrl
+c
和ctrl
+v
无法用来复制粘贴,通过设置git bash,实现点击鼠标右键即可完成粘贴的功能(git bash中复制快捷键为ctrl
+Insert
)。
配置流程如下:
设置git bash背景颜色
打开git bash,在其顶部栏单击右键->options
,在Looks
选项中点击Background
属性,将背景颜色设置为白色,随后apply
。
设置字体大小
在Text
选项中,点击右侧的select
,选择字体为"Consolas",大小为14pt,apply
。
鼠标右键粘贴
在Mouse
选项中,在右侧Right mouse button
一栏选中Paste
选项,使得鼠标右键具有粘贴功能,apply
。
设置git bash窗口大小
首先点击save
保存之前的设置,随后使用鼠标对git bash窗口边界进行拖拉以缩小或放大,调整出一个自己喜欢的大小,随后再次打开options
,在Window
下点击Current size
,随后save
即可,最后关闭并重新打开git bash,设置生效。
通过配置文件设置git bash
git-completion.bash
。git-prompt.sh
。在bash_profile_course
文件末尾添加一行代码:
alias subl="C:/Program\ Files/Sublime\ Text\ 2/sublime_text.exe"
这行代码的作用是可以让git bash 使用subl
+filename
命令调用sublime编辑文件,不过需要注意的是,此处的路径为sublime编辑器安装的路径,且如果路径中有空格,需在空格前添加\
。
将git-completion.bash
、git-prompt.sh
、bash_profile_course
三个文件移到git bash上的主目录下(~),可通过mv
命令完成:
mv git-completion.bash ~
mv git-prompt.sh ~
mv bash_profile_course ~
查看~目录下是否有.bash_profile
文件:
ls -a
如果没有,则将bash_profile_course
更改为.bash_profile
:
mv bash_profile_course .bash_profile
如果事先存在.bash_profile
文件,则将bash_profile_course
文件中的内容追加到.bash_profile
文件中即可。
最后在git bash中执行如下命令:
git config --global core.editor "'C:/Program Files/Sublime Text 2/sublime_text.exe' -n -w"
git config --global push.default upstream
git config --global merge.conflictstyle diff3
git config --global color.ui auto
需要注意第一条命令,其中的路径与4中一样,以自己sublime安装的路径为准。
浏览git仓库中当前分支的提交(commit)记录
git log
如果还想要从结果中额外显示出在各个相邻记录间做出的文件修改信息,可以添加--stat
参数:
git log --stat
以上的命令是查看当前分支的commit记录,如果想要查看特定分支,使用:
git log branch_name
在使用git log
命令时,还可以添加--graph
和--oneline
参数:
git log --graph --oneline branch_name
其中,--graph
帮助在视觉上直观地看出每个commit的范围,而--oneline
则让输出更加简洁,只有一行信息——提交信息输出。
如果想要查看两个分支之间的关系,可以使用:
git log --graph --oneline branch1_name branch2_name
查看不同提交之间的文件差异
git diff commit_ID_1 commit_ID_2
如果不带任何参数,则比较的是本地文件夹和git暂存区之间的差异:
git diff
这个命令通常用在用户修改了本地文件夹下的文件,但想在git add
之前查看到目前为止究竟一共修改了哪些内容,以便检查和确认这些修改就是自己想要提交的内容。
需要说明的是,git暂存区的状态是最近一次有关commit操作时git仓库的状态,比如使用git commit
将文件从暂存区提交到仓库时,暂存区的状态也会同步更新到此时仓库的状态;类似的情况也发生在git checkout
检出仓库的不同提交版本之时,暂存区的初始状态就是检出commit后仓库的状态。
但如果是想要比较当前暂存区与git仓库之间的文件差异(如git add
后但在git commit
前),使用:
git diff --staged
仓库克隆
git clone https://github.com/LiTAooooo/gfgfgf.git
其中的URL指向了想要克隆的远程仓库。
需要注意的是,git clone
还进行了额外的操作,即为本地的克隆仓库自动添加了一个远程仓库,该远程仓库就是克隆的原始仓库。
检出特定的提交或分支
git checkout commit_ID
git checkout branch_name
在本地建立git仓库
git init
建立完成后就可以通过ls -a
命令看到隐藏的.git
文件夹。
查看git仓库的当前状态(非常好用)
git status
向暂存区中添加文件
git add file_name
如果不小心将文件添加到暂存区或者想要将文件从暂存区中删除,使用git reset
进行删除:
git reset file_name
如果想要删除自上次commit以来本地文件夹和暂存区所做出的所有修改(相当于放弃了所有工作),使用:
git reset --hard
将暂存区的文件提交到git仓库
git commit
此时,由于之前为git bash设置了文本编辑器,会自动弹出编辑器来让提交者编辑提交信息。如果需要提交的信息较短没有必要打开编辑器的话,可以使用-m
参数:
git commit -m "Commit Message"
需要注意的是,添加提交信息的标准做法是以祈使句的语态叙述,如"添加xxx文件"或"修改xxx文件",而不是"添加了xxx文件"或"修改了xxx文件"。
显示当前git仓库中的所有分支
git branch
创建新的分支
git branch branch_name
此命令会在当前检出的commit的基础上创建一个标签名为branch_name
的分支。
处于分离的头部状态
有时候,当我们使用git log
查看某一分支的提交记录,并且随后通过git checkout
检出记录中的某一次提交时,git bash很大概率会出现以下提示:
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
这个提示说明你正处于“分离的HEAD”状态,"HEAD"是指当前所检出的commit。当此时检出的commit不是某个已存在的特定分支的最新commit时(即该commit没有任何分支标签来标记),则会处于“分离的HEAD”状态。在此情况下,如果对检出的commit进行修改并提交时,新的commit不会添加到已有分支内的任何部分中(对已有分支不产生任何影响),而是会自动添加到一个新的不具有分支标签的分支上。此时新创建的分支是一个临时分支,git具有gc(垃圾回收)功能,会不时自动删除那些无法被现有分支索引到的commit,由于新的分支不具有分支标签,一旦通过git checkout
转移到其它分支上后,该分支将永远无法再次访问到(除非你记住了之前commit的ID,这有点像C语言通过指针误操作造成内存泄露的感觉)。
以上情况通常会以这样一个例子呈现:当开发者想对历史某个版本(commit)进行新的开发,使其独立且并行于现有版本,则可以检出该历史版本(此时处于“分离的HEAD”状态),在该历史版本的基础上进行功能修改或添加,随后对修改进行提交,使其成为一个新的分支(此时的分支是临时分支)。
为了让新的分支得以保留,那么必须为其赋予标签名进行标记(一方面使其能够访问,另一方面防止gc自动回收),为此,可以使用如下组合命令:
git branch new_branch_name
git checkout new_branch_name
由于该操作十分常见,属于常用操作,所以git也提供了更加简化的命令来完成上述工作:
git checkout -b new_branch_name
这样一来,就可以在原有commit的基础上真正完成一个分支的创建。
合并分支
如果需要执行合并分支操作,首先需要确定需要最终合并到哪个分支上,选择需要合并到的分支并git checkout
(假设有分支a和b,如果想把分支a合并到分支b上,则检出b,反之亦然)
执行命令:
git merge branch_name
执行完毕后,branch_name分支将会合并到当前检出的分支,使用git log
可以看到当前分支的commit记录已经包含了branch_name中的commit和当前分支中的原有commit。而branch_name分支不会受到影响,其commit记录不会发生改变。
分支合并后,在当前检出的分支中查看commit记录,会发现branch_name中的commit和当前分支原有commit按提交的时间顺序进行排列,且最新的commit包含了两者所有的修改。
合并分支后,由于commit记录被“打乱了”,所以此时如果依旧通过git diff
比较相邻commit之间的差异则会无法得到想要的结果。基于这种情况,如果想知道某个commit在其直接父级commit的基础上做了哪些修改,使用git show
:
git show commit_ID
在将分支a合并到分支b上后,如果不再对a进行修改(不再需要分支a),可以将其删除:
git branch -d branch_a
需要注意的是,这里只是删除了该分支的标签(使其无法再通过标签a访问其内部的commit),但是并没有删除其内部的commit,因为其内部的commit被“转移”到分支b上去了(需要保留)。
为本地git仓库添加远程仓库
首先可以通过git remote
命令查看已添加的远程仓库
git remote
要想添加新的远程仓库,使用:
git remote add remote_name URL
向远程仓库推送数据
git push remote_name branch_name
这条命令的作用是将本地仓库中名为branch_name的分支推送到名为remote_name的远程仓库中,很多情况下为了避免本地库与远程库不同步而导致无法push的情况,最好先pull再push(只有远程库是本地库中commit的子集时,才能够push)。
从远程仓库拉取更改
git pull remote_name branch_on_remote
这条命令是将名为remote_name的远程库上的branch_on_remote分支拉取到当前检出的分支上,这样就可以使得当前检出的分支包含远程库上对应分支的所有提交记录。
更新本地用于标记远程库分支状态的分支
git fetch remote_name
此时会把远程库中的所有分支的commit信息更新到本地库中用于标记远程库分支状态的对应分支上,比如remote_name库上只有一个master分支,则更新本地的remote_name/master分支。
需要注意的是,git pull
命令的执行过程是git fetch
+git merge
。