Git学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git学习笔记相关的知识,希望对你有一定的参考价值。

1~安装
安装完成后,还需要最后一步设置,在命令行输入:
git config --global user.name "ching"
git config --global user.email "[email protected]"

2~创建版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录
git init

3~将文件添加到版本库
第一步,用命令git add告诉Git,把文件添加到仓库
git add readme.txt
第二步,用命令git commit告诉Git,把文件提交到仓库
git commit -m "wrote a readme file"

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

嫌麻烦不想输入-m "xxx"行不行?确实有办法可以这么干,但是强烈不建议你这么干,因为输入说明对自己对别人阅读都很重要。实在不想输入说明的童鞋请自行Google,我不告诉你这个参数。

git commit命令执行成功后会告诉你,1个文件被改动(我们新添加的readme.txt文件),插入了两行内容(readme.txt有两行内容)。

为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件


4~时光机穿梭
我们继续修改readme.txt文件
运行git status命令看看结果
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看
git diff readme.txt

好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是“add distributed”的那个版本,怎么做呢?

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:

git reset --hard HEAD^

最新的那个版本append GPL已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?
办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本,版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。:
git reset --hard 3628164
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改

撤销修改
git checkout -- file
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。
现在假定是凌晨3点,你不但写了一些胡话,还git add到暂存区了
庆幸的是,在commit之前,你发现了这个问题。用git status查看一下,修改只是添加到了暂存区,还没有提交
Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本

git pull origin master --allow-unrelated-histories

ssh-keygen -t rsa -C "[email protected]"


git diff -b 显示所有的差异


git checkout -b dev 创建新的分支

git checkout dev 切换分支

git branch -d feature1 删除分支

git reset HEAD -filename 撤销某个add

git pull origin master 将远程的 合并到本地master

git reflog Git提供了一个命令git reflog用来记录你的每一次命令

git checkout -- file可以丢弃工作区的修改。把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。


git reset HEAD <file> 用版本库的文件覆盖工作区和暂存区,把暂存区的修改撤销掉(unstage),重新放回工作区
执行后,暂存区是干净的,工作区有修改


git rm test.txt 从版本库中删除该文件,同时工作区的文件也会被删除


git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

git push origin master 普通使用这个命令提交


git clone [email protected]:ascmove/gitskills.git


git merge dev 我们把dev分支的工作成果合并到master(当前分支)分支上。git merge ffff命令用于合并指定分支到当前分支
上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快

git merge feature1如果有冲突,则会在文件中产生》》》》》》》》》符号


git log --graph --pretty=oneline --abbrev-commit 查看分支情况
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

git merge --no-ff -m "merge with no-ff" dev 请注意--no-ff参数,表示禁用Fast forward因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。


当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交.
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash
git stash list
git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
git stash pop,恢复的同时把stash内容也删了
git stash apply [email protected]{0} 你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令

 

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
现在,你终于接到了一个新任务:开发代号为Vulcan的新功能

git checkout -b feature-vulcan 创建分支

就在此时,接到上级命令,因经费不足,新功能必须取消!
git branch -d feature-vulcan
销毁失败。Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用命令
git branch -D feature-vulcan


要查看远程库的信息,用git remote
git remote -v 显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。


推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
git push origin master
git push origin dev 推送开发板分支


但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!


现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆
git clone [email protected]:michaelliao/learngit.git
当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看
现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支
git checkout -b dev origin/dev


你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送
推送失败,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送
git pull
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
git branch --set-upstream dev origin/dev
这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push

 

产生冲突时,现用记事本删除冲突的地方,保存之后,使用git add *
git commit -m "merge"命令进行合并后会自动切换到dev分支


git标签管理

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
请把上周一的那个版本打包发布,commit号是6a5819e...
请把上周一的那个版本打包发布,版本号是v1.2

git tag v1.0 打标签


可以用命令git tag查看所有标签


有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了
git tag v0.9 6224937
git show v0.9 标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息
git tag -a v0.1 -m "version 0.1 released" 3628164 还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -s v0.2 -m "signed version 0.2 released" fec145a 可以通过-s用私钥签名一个标签


如何从其他分支merge指定文件到当前分支,git checkout 是个合适的工具。
git checkout source_branch <path>


git pull的时候遇到这样的问题:
The following untracked working tree files would be overwritten by merge balabala...

解决办法:
git clean -d -fx

备注:会删除掉没有add到仓库的文件,操作记得慎重,以免改动文件的丢失。本质上就是操作仓库中没有被追踪的本地文件

$ git clean -f -n # 1
$ git clean -f # 2
$ git clean -fd # 3
$ git clean -fX # 4
$ git clean -fx # 5

(1): 选项-n将显示执行(2)时将会移除哪些文件。
(2): 该命令会移除所有命令(1)中显示的文件。
(3): 如果你还想移除文件件,请使用选项-d。
(4): 如果你只想移除已被忽略的文件,请使用选项-X。
(5): 如果你想移除已被忽略和未被忽略的文件,请使用选项-x。

以上是关于Git学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Git学习笔记

Git学习笔记

Git学习笔记4

git学习笔记

Git 学习笔记

Git学习笔记总结和注意事项