1.安装git
$ sudo apt-get install git
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com" --global参数表示这台机器上所有的git仓库都会使用这个配置
2.创建版本库repository(一个使用git进行管理的目录)
$ mkdir learngit & cd learngit
$ git init (使用ls -ah查看隐藏文件.git)
3.添加文件到仓库
$ git add <file>
$ git commit -m <message>
4.查看仓库当前的状态
$ git status 如果git status告诉你文件被修改过,可以查看具体的修改内容 $ git diff,只能在修改文件这一步后查看
第一次添的加文件且没有进行提交过:untracked files(并且用git diff查看不到)
修改完文件:no changes added to commit (use "git add" and/or "git commit -a")
执行完add:Changes to be committed
执行完commit:nothing to commit, working directory clean
5.查看最近到最远的提交日志
$ git log --pretty=oneline 其中一大串的数字是git的版本号(commit id)
6.版本回退
HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本,HEAD~100表示往上100个版本
$ git reset --hard HEAD^ 退回上一个版本 $ cat readme.txt查看文件内容 $ echo 'ABC'>>readme.txt新建简单的文本
$ git reset --hard 1094a 回到未来的commit id为1094a的版本
$ git reflog 记录每一次的命令(如果想回到未来的版本但是找不到版本号);重回过去,用 $ git log查看提交历史,确定要回退到哪个版本,重返未来,用$ git reflog查看历史命令,确定要回到未来的版本
Git的版本回退速度很快,是因为Git内部有个指向当前版本的HEAD指针,当回退版本的时候,Git仅仅把HEAD指向回退的版本
7.工作区(working directory):learngit文件夹 版本库(repository):.git目录
Git的版本库里最重要的是称为stage(index)的暂存区,还有Git自动为我们创建的第一个分支master,以及指向master的指针HEAD
暂存区与版本库的区别:第一次修改 -> git add -> 第二次修改 -> git commit。当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交
8.查看工作区和版本库里最新版本的区别
$ git diff HEAD -- readme.txt
9.git checkout命令
命令$ git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。总之,就是让这个文件回到最近一次git commit或git add时的状态
10.git reset命令
命令$ git reset HEAD readme.txt可以把暂存区的修改撤销掉,重新放回工作区,再用$ git checkout -- readme.txt命令丢弃工作区的修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作
11.从版本库中删除该文件rm XXX
删对了,那就用命令git rm删掉,并且使用git commit;删错了,可以很轻松地把误删的文件恢复到最新版本:$ git checkout -- test.txt,但是如果执行git rm XXX删除文件用checkout就找不回了
12.添加远程仓库
(1)创建ssh key,cd到用户主目录的.ssh文件夹下,查看有没有id_rsa(私钥)和id_rsa.pub(公钥),有的话直接跳过,没有的话$ ssh-keygen -t rsa -C "email address",然后一路使用默认值
(2)在github的ssh key选项中添加id_rsa.pub中的内容
(3)在github上面创建repository(创建一个新的git仓库)
(4)在本地关联仓库中输入git remote add origin https://github.com/YINTANGNI/learngit.git用来关联远程库,远程库的名字就叫origin。关联后,使用命令git push -u origin master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改
13.克隆远程库
$ git clone https://github.com/YINTANGNI/learngit3.git
14.git创建分支
HEAD指向当前分支,master指向最新提交的分支
$ git checkout -b dev 创建并转换分支(相当于创建分支$ git branch dev & 切换分支$ git checkout dev),接下来在分支上进行操作后使用$git add & $ git commit提交给分支
$ git branch 查看当前分支
$ git checkout master 返回master分支
$ git merge dev 将dev分支的工作合并到master上(Fast-forward)
$ git branch -d dev 删除dev分支
$ git branch -D <name> 强力删除没有合并的branch
冲突解决:在分支上修改文件并执行git add和git commit后,切换到master,在master上修改文件并执行git add和git commit后,执行merge时会发生冲突。在master分支中使用git status查看冲突的文件,查看并修改冲突的文件后,重新使用git add和git commit提交,最后删除刚才操作的分支
命令$ git log --graph --pretty=oneline --abbrev-commit查看分支的合并情况
$ git merge --no-ff -m "merge with no-ff" dev 不使用fast forward模式合并,保留分支的信息。使用ff模式只会显示最终的修改结果,不保留分支信息
15.分支管理原则
master只发布稳定的新版本,在dev上面干活,每个人拥有自己的分支,不断地向dev分支上合并就可以了。添加新功能时,不希望实验性质的代码搞乱主分支,因此添加的新功能最好在feature分支上开发、合并,最后删除feature分支。
16.BUG分支
修复bug可以通过新建临时分支(issue-number),修复后合并分支,然后删除临时分支
如果是未曾提交过的文件,需要通过命令$ git add XXX将未保存的文件提交到暂存区,让git能够追踪这个文件
$ git stash 将工作现场出藏起来等恢复现场后继续工作(当前在dev分支)
$ git checkout master 切换回master
$ git checkout -b issue-101
修复完bug后通过命令$ git add & $ git commit命令提交,然后切换回master分支,通过命令 $ git merge --no-ff -m 'merged bug fix 101' issue-101,最后删除分支
$ git checkout dev 切换回dev分支
$ git stash list 查看刚才的工作现场
方法一:$ git stash apply 恢复后不删除stash内容,需要用$ git stash drop来删除
方法二:$ git stash pop 恢复的同时删除了stash内容
可以多次使用stash,然后用list查看后,通过命令 $ git stash apply stash@{0}进行恢复