git的使用

 

关于ubuntu下使用git比较好的说明:

https://blog.csdn.net/vslyu/article/details/80337675

一些常见的命令:

git   --version     查看版本

git  config      查看配置的相关命令行,具体而言

 

全局设置,当有变更的时候会提示相关人并给相关人的email发邮件,当没有设置全局的时候,在变更提交的时候会有waring提示提示你设置,global对当前用户所有仓库有用:

git config   --global  user.name  "your name"   

git config    --global   user.email  "your [email protected]"

 

显示当前的已经有的config设置,则加“   --list”,同样的会有 --global   --system  --local(当前):

git config  --list   --global

git config  --list    --system :第一次使用git的时候可能会有错误,“fatal: unable to read config file '/etc/gitconfig': 没有那个文件或目录”

git  config  --list    --local :默认情况。等同于“git config  --list”。当然你必须得保证你现在已经在“当前仓库”了。

-------------------------------------------

创建仓库:

1.git init,先有项目了,后期添加git。(不建议此种方式,此种方式下,git初始化之前项目的变更过程被miss掉了)

administrator@ubuntu:/host/js_html_css/git$ git init
/  **已初始化空的 Git 仓库于 /host/js_html_css/git/.git/**  /

2.先建git仓库后,再做项目

administrator@ubuntu:/host/js_html_css/git$ git init  first-git
 /** 已初始化空的 Git 仓库于 /host/js_html_css/git/first-git/.git/   **/

untracked files 通常翻译成“未被管理的文件”。

------------------------------------

图形化工具(逼格不高不建议使用)

sudo apt install gitk  安装

gitk(".git"文件夹存在的条件下打开,打开也是在当前的文件夹下打开,或者cd到相应的文件夹下)

------------------------------------

git add   : 添加到暂存区

unstage :暂存区

 

git  commit  -m  "备注"    :提交(通常与git add连续操作,因此git commit不带文件名,而需要“备注”)

git commit --amend  进入类vim/vi界面修改最近一次的“备注”。amend:修理。我的版本是ctrl+x退出vim/vi(:wq)

一般而言,完整的commit操作步骤大概是这样的:

git add xxx --->git diff --cached --->git commit -m "ooxxoox".

 

git status  :查看仓库此时的状态,并且会显示当前工作所在的分支。

git cat-file  -t    :"t"=type,查看类型

git cat-file  -p   查看具体的内容

git  branch -av  查看所在的分支

 

git log  -n1 : 查看最近一次的变更。“n1”可以随意的变化,git log  -n2,表示查看最近2次的变更。

git diff  commit1(hash)  commit2(hash): 比较commit1/commit2的差异。

git diff  HEAD  HEAD^(HEAD^^/HEAD^^^....or  HEAD~1/HEAD~2/HEAD~3):指向不明,未熟练之前不建议使用。

 

 

-----------------------

一些常见的错误提示

you  are in "detached HEAD" state.

detached   adj.单独的; 独立的; 不连接的; 

HEAD 这个词的翻译最好翻译成线"头"。它在.git文件夹里是确实存在的。直接查看.git/Head文件会看到当前的工作的线头所处的分支。使用命令git checkout temp(temp为任意分支)可以切换分支,切换分支也可在.git/HEAD文件下明白的显示出来。

因此,"detached HEAD"可以翻译成"分离头"。

线头HEAD必须得与分支branch绑定在一起,否则就算commit了。git也认为是不重要的commit,不会在全局的树(gitk查看)上显示出来,过段时间也会清理掉。因此,当报错"you  are in "detached HEAD" state."的时候,应当要注意。

要想处于"detached HEAD state",可以使用命令 :git checkout  当前的commit的hash值 。当处于"detahced HEAD"的时候,所在的修改如果最后没有与分支branch绑定在一起的话,最后会失去该变更。因此,可以把“detached  HEAD”当做一种“草稿纸”,如果最后的更改不满意,则可置之不理,git管理软件过段时间会自动打扫,清理掉类似的状况所产生的无效变更。

当然,如果在“草稿纸”状态(detached head state)下的更改很符合自己的意图,则需要将线头head连接到某一个具体的分支branch上。操作命令如下:git  branch  新建的分支名(branch)  commit(detached HEAD ,hash值)

------------------

git branch 分支名: 创建分支

git branch  -v:  查看仓库分支情况

git branch  -av:查看仓库分支情况

git branch -d:删除分支。(分离头状态下的commit由于系统过段时间会自动删除掉,所以不存在删除分离头的命令)

git branch  -D:git  branch -d删除不掉的情况下使用。强制删除。

 

------

git rebase   

git rebase  -i  commit(hash,需要更改哪一个则找到上一级的commit对应的hash),出现如下的交互(i="interact"的英文含义)界面:(此界面非常以及及其的重要,#下列出了所有的可能的操作,这些操作都是相对于"pick"而言的,更改hash前的"pick"成对应的命令缩写(p/r/e/s/f/x/d),可对相应的hash 进行操作。)

pick 4c879a6 aa.txt
pick ecb9a77 direcory_babel__00

# 变基 f4ecf17..ecb9a77 到 f4ecf17(2 个提交)
#
# 命令:
# p, pick = 使用提交
# r, reword = 使用提交,但修改提交说明
# e, edit = 使用提交,但停止以便进行提交修补
# s, squash = 使用提交,但和前一个版本融合
# f, fixup = 类似于 "squash",但丢弃提交说明日志
# x, exec = 使用 shell 运行命令(此行剩余部分)
# d, drop = 删除提交
#
# 这些行可以被重新排序;它们会被从上至下地执行。
#
# 如果您在这里删除一行,对应的提交将会丢失。
#
# 然而,如果您删除全部内容,变基操作将会终止。

一共会跳出2次的vim界面,上面是第一次的vim界面。在此界面中从#下的说明中选择合适的命令或者命令缩写代替"pick"。

#将pick 4c879a6 aa.txt中的pick替换成r,表示选择的命令是"r"对应的命令
r   4c879a6 aa.txt

保存之后,会出现第二次的vim 界面,大概的情况是这样的(以命令“reword/r”为例,即修改message):

 

#此处为commit修改后的message名字:
利用git rebase -i修改非最近的commit的message啊~,两次跳出vim界面两次修改。

# 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交
# 说明将会终止提交。
#
# 日期:  Tue Aug 6 11:04:24 2019 +0800
#
# 交互式变基操作正在进行中;至 f4ecf17
# 最后一条命令已完成(1 条命令被执行):
#    reword 9872349 利用git rebase -i修改非最近的commit的message啊~,两次跳出vi$
# 接下来要执行的命令(剩余 1 条命令):
#    pick fafee13 direcory_babel__00
# 您在执行将分支 'master' 变基到 'f4ecf17' 的操作时编辑提交。
#
# 要提交的变更:
#       新文件:   aa.txt
#       新文件:   babel/.babelrc
#       新文件:   babel/dependencies
#       新文件:   babel/lib/zhuanhuan.js

将多个commit合成一个commit:

1.git  rebase  -i  父级commit   ---》2.进入第一个vim界面:保留第一个pick作为squash进去的对象,后面的对应的commit前的“pick”换成“s”或者"squash"(squash:使... 挤进; 塞入)  ----》3.进入第二个vim/vi界面:具体的如何的"squash",即将多个commit合成(squash)一个commit。具体的如下:

#进入第一个vim界面:保留第一个pick作为squash进去的对象,后面的对应的commit前的“pick”换成“s”或 
 # 者squash
#第一个作为squash进去的对象,不需要更改
pick 26f4f83 001

#后面2个pick改成“s”/“squash”
s 5a2a19d 002
squash 1ebff7f 003

# 变基 db5cdb8..1ebff7f 到 db5cdb8(3 个提交)
#
# 命令:
# p, pic
........
...........
#进入第二个vim/vi界面:具体的如何的"squash",即将多个commit合成(squash)一个commit           


# 这是一个 3 个提交的组合。
# 这是第一个提交说明:

001(这里可以更改,以后3个commit都以更改后的形象出现)

# 这是提交说明 #2:

002(这里也可以更改)

# 这是提交说明 #3:

003(这里还是可以更改)


如果要合并的commit是第一个commit,无法找到父级,可以直接用这个commit进入命令提示操作git rebase -i xxx(即第一个vi界面)。进入界面之后,再将此第一个commit按照格式添加进去,同时把不需要合并的commit删除掉,需要作为靶子的squash进去的对象可以往前提到最前,同时将相应的pick修改成对应的命令。-----------从以上可以看出,git rebase -i xxx是把xxx之前的所有的commit全部在第一个vi界面显示出来,在此界面下,操作者的自由非常的大,可以添加commit,可以剔除掉某个commit(删除请慎重,本地文件也可被删除,但是可以通过checkout到别的branch恢复),还可以通过修改"pick"换成对应的操作来达到相应的目的

 

操作中如果操作不当,会提醒你使用下列命令(此操作不可使用或者务必慎用,否则会把本地的文件给删除掉):

rm -fr "/host/js_html_css/quanzhan_development/.git/rebase-merge"

 

要说明的是,这种修改会改变自身commit的hash值,也会改变子集元素的hash值,联合操作的时候不应该有这种操作,否则会影响到其他的人。 

--------------------------------------------------

工作区  暂存区   HEAD

unstage && HEAD

流程是这样的: 已经纳入git管理的文件被修改了--》git add xxx(暂存区unstage)--》git  diff  --cached(双破折号“--”,比较暂存区和HEAD,HEAD可以是分离头状态,也可以是连接到某个branch上的状态。) --》git commit  -m ""

简单的而言,以后提交的流程多了个操作的步骤git diff --cached,变成:

 git add xxx --->git diff --cached --->git commit -m "ooxxoox".

 

工作区&&HEAD(commit)

工作区--》git add xxx,添加到暂存区--》git commit -m"",提交到HEAD(detached head/branch)。git diff 还可以比较工作区和已经提交了的commit(head)的比较

git diff :查看工作区和head(commit)的所有的差异。会把所有的文件的差异都罗列出来。[这里说的不准确。关于git diff 的补充说明。git diff 先是比较工作区和暂存区的变化,再比较工作区和head的变化,有优先级的关系。即当工作区,暂存区,HEAD都存在的差异的时候,git diff 只会显示工作区和暂存区的差异。但是一般的时候,只有暂存区往往跟head没有差异或者不存在三种差异同时存在的情况。故而原先的结论部分成立。]

git diff   --文件1  文件2  文件3:文件1/2/3之间用空格隔开,可以只有1个文件。意思是把“--”后所有的文件在工作区和提交后在branch/head上的差异显示出来。(此条区别具体文件有无更改的命令无法使用,不知何故??但是区分所有差异的命令“git diff ”可以使用。ubuntu环境。补充说明,当前环境下,不用破折号“--”,直接后带文件可以此命令:“git diff 文件1 文件2 文件3”。这与视频中的讲解有所不同。)

 

特殊关系:当一个工作区的变更add到暂存区的时候,原来的工作区的变更神秘的消失了,这个时候比较工作区和HEAD,发现原来的存在的变更后的文件的差异也消失了。但是,暂存区和HEAD的变更后的文件的差异却存在了,这个差异可以使用git diff --cached查看。理解这个关系,可以更好的理解工作区-暂存区-HEAD三者之间的关系。(注:git status----暂存区的文件通常在bash中以绿色字出现。工作区的文件如果变更了在bash中以红色的字体出现。git diff 系列命令  ---文件差异中增加的内容以绿色的字体出现,删去的内容以红色的字体出现)

 

取消暂存区的变更:

//当变更存在于暂存区的时候,会有如下的提示:
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

1.取消暂存区的所有的变更:git reset HEAD

2.取消暂存区的某一个文件的变更:git reset HEAD 文件名

注意:取消暂存区的变更后,则执行的是“特殊关系”的反面,此时暂存区&&HEAD不存在差异,但是工作区&&HEAD却又开始存在差异了。

 

工作区的变更不如暂存区的变更,使用命令使工作区的变更还原到暂存区的变更:

git checkout 文件名(视频中用的是“git checkout  --文件名”,本环境与视频中的操作略有不同)

 

简言之,暂存区的不想要用git reset HEAD  --文件名,工作区的不想要用git checkout  文件名,存在下面的链式关系:

工作区 --》(git checkout 恢复到)暂存区---》(git reset HEAD  恢复到) HEAD

 

删除某个节点之前的变更:

 先要确定已经在某一个具体的分支下(没有这一步就是乱来),git reset  --hard   +某个具体的节点的hash值。效果是在该分支上面的,该具体的节点之前的所有的变更全部取消。 “--hard”这个命令“暗示”这个命令应该慎用!!要注意的是,“git reset  --hard   某个具体的节点的hash值”可以是别的分支上的节点的hash值,这么做的后果是该条分支上所有的变更都失效,且hash对应的节点所在分支下的所有的变更,包括该节点本身都会出现2条branch,一条是原先的branch一条是被删光所有变更的branch。

从以上可知道,git reset 是个恢复操作,当不需要工作区需要暂存区则恢复到暂存区git checkout 文件名,当不需要暂存区需要之前的版本(之前的版本好啊)则恢复到之前的版本git reset HEAD,当不需要某个节点之前的变更则使用git reset --hard.

git diff 后还可以跟两个不同的分支名,用以区别2个分支的所产生的变更的不同,具体的:

git  diff  branch1(or 该分支上最后1次commit的hash)   branch2(or 该分支上最后1次commit的hash)   --xxx(具体的某一个文件名)。该命令表示查找出branch1/branch2上xxx文件(变更)的不同。[注:本次使用无法带上“--xxx”,不知何故?]

administrator@ubuntu:/host/js_html_css/quanzhan_development$ git diff yy master --/BB.txt
/*报错以下内容,ubuntu环境*/
usage: git diff [] [ []] [--] [...]

-------------------

文件的更改和删除

git  mv  文件名1 文件名2 

将branch上的文件名1改成文件名2.同时,本地的文件也会发生同样的变化。

 

git  rm  文件名

删除掉branch上的文件。本地文件也会被删除。删除文件也是作为一个变更提交到相应的branch上的,因此当要错误删除某一个文件而想要恢复它的时候,可以采取之前的取消变更的操作:git reset --hard  HEAD

---------------------

git stash 

stash 

v. 存放; 贮藏; 隐藏;
n. 一批贮藏物;

 

git stash系列的作用是将当前的工作先“stash”起来,然后动手忙领导给的新的比较急迫的优先级比较高的任务(需求/变更),等到新的比较急迫的任务完成之后,再恢复原先一开始还没有完成的任务。它通常有以下的几个操作命令:

git stash  --list

列出"stash"出来的清单。命令行的使用场景:你当前正在忙任务1,领导先给你了一个优先级比较高的任务2,于是你将任务1git stash起来,开始忙任务2.忙任务2的过程中,领导又给了一个比任务2更高优先级的任务3,于是你又将任务2"git stash"起来。

git stash  apply

git stash  pop

由"pop"即可看出是一个栈操作。"后进先出"

更详细的可查看:

https://www.cnblogs.com/qianqiannian/p/6011513.html

----------------------------

.gitignore 1.这个文件主要用来忽略不需要被纳入.git管理的文件名2.这个文件只能叫这个文件名,否则不起作用。(好奇:不add到暂存区不提交,也不会被纳入管理,为何不这么做呢?难道只是为了“git status”的时候不出现没有红色字表示的被纳入管理的文件?)

 

---------------

复合的命令的分解

1. git checkout    -b   fix_readme   fix_css

这个命令的意思是在fix_css下再创建一个新的分支的分支fix_readme,创建完分支之后,当前工作的内容再从原来的分支branch(当前的工作所在的分支不一定是fix_css)或者线头head所指向的commit切换checkout到新创建的fix_readme。

2.git  branch  新建的分支名(branch)  commit(detached HEAD ,hash值)

创建一个新的分支branch,并将处于分离头状态(detached HEAD)的commit(hash值)挂到branch上。

 

你可能感兴趣的:(开发工具,学习笔记,系统(需求)分析)