跟着https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000进行学习,这篇作为学习笔记使用
学习Git需要弄清楚工作区和暂存区的区别,详细看连接中的“工作区和暂存区”
一、安装Git
1.Git安装完成后,打开Git Bash,进行设置,在命令行输入:
$ git config --global user.name “Your Name”
$ git config --global user.email "email@example.com"
二、创建版本库
1.创建目录
$ mkdir learngit
$ cd learngit
2.把这个目录变成Git可以管理的仓库
$ git init
3.添加文件至版本库
- 1)在learngit目录下添加一个文件readme.txt,内容如下
Git is a version control system.
Git is free software.
建议使用Notepad++ 来编辑此txt,微软自带的word和记事本有特殊的存储格式容易出错,此外存储格式应为UTF-8,减少编码带来的问题。
不清楚目录路径的话可以使用pwd命令显示当前目录的路径。
- 2)用git add将文件添加到仓库
$ git add readme.txt
如果一次性提交多个文件,可用空格将各个文件名隔离开来
- 3)使用git commit命令提交本次提交的说明
$ git commit -m “wrote a readme file”
""内是本次提交的说明
三、查看工作区状况、修改的具体内容
1.查看仓库当前的状态
git status
可用于查看某些文件被修改等
2.查看文件具体的修改
diff也就是different的缩写,显示格式是Unix通用的diff格式
git diff
四、版本回退
1.查看历史修改记录(可查看commit -m 的内容)
使用命令查看历史修改记录,显示的时候,HEAD表示当前版本
git log
如果觉得输出信息太多,可以使用
git log --pretty=oneline
2.版本回滚
- 返回上一个版本
$ git reset --hard HEAD^
- 则返回上上个版本为
$ git reset --hard HEAD^^
- 如果要返回多个版本,也可使用(此处示例返回往上第二个版本)
$ git reset --hard HEAD~2
- 返回至指定的版本可以用(此处的1094a为commit id,仅输入前几位已经足够)
$ git reset --hard 1094a
- 当想要从旧版本返回至新版本的时候,使用如下命令查看命令历史记录
git reflog
五、撤销修改
1.撤销工作区域修改(适用于还没有进行add操作的已经修改的文件)
eg:撤销工作区域readme.txt的修改
git checkout – readme.txt
2.撤销暂存区的修改(适用于进行add还未进行commit的文件)
$ git reset HEAD readme.txt
六、删除
1.删除文件
git rm test.txt
七、上传至远程仓库
1. 生成SSH key
$ ssh-keygen -t rsa -C "youremail@example.com"
生成两个文件,id_rsa是私钥自己保存后,id_rsa.pub 是公钥可用于分享
2.远程仓库准备
- 在用户目录-》.ssh中找到id_rsa.pub
- 登陆GitHub,"settings” -> "SSH and GPG keys” -> “New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
3.关联远程库
- 1)登录GitHub 点击加号 -> new repository
- 2)在Repository name 填入名字,其他保持默认,点击“Create repository”,创建Git仓库
- 3)在本地 learngit 仓库运行命令,添加后,远程库的名字就是origin
git remote add origin git@github.com:GitHubName/Repository name.git
4.将本地库的所有内容推送到远程库上
第一次输入命令
$ git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令为
$ git push origin master
八、从远程仓库克隆
输入命令
$ git clone git@github.com:GitHubName/Repository name.git
会将整个工程文件拷贝至与Repository name相同的文件夹下
九、创建与合并分支
1.创建分支
- 1.创建并且切换到dev分支
$ git checkout -b dev
- 2.git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
-
3.可用git branch命令可查看所有分支,并且在当前分支前会标一个*
-
4.将dev的分支工作合并到master分支(主分支)上
$ git merge dev
- 5.现在可以删除dev分支
$ git branch -d dev
十、发生冲突
当不同分支修改了同一文件,比如说都修改了readme.txt,git尝试合并分支的时候就会出现冲突,错误提示如下
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
告诉我们两个线程都修改了readme.txt
此时 readme.txt 内容如下
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
必须修改readme.txt,后再次进行add 和 commit 命令更新版本。
我们可以使用带参数的git log查看分支的合并情况
$ git log --graph --pretty=oneline --abbrev-commit
十一、分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
禁用Fast forward进行分支合并使用命令(即不删除此分支信息),因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
$ git merge --no-ff -m “merge with no-ff” dev
不使用Fast forward的分支情况如下
若不禁用Fast forward,则没有dev这个分支的信息。在git log中不会显示出来。
十二、Bug分支(修复bug的时候进行的分支创建)
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
- 1.此时可以使用命令,将当前的工作现场存储起来
$ git stash
- 2.若要在master分支上修复,则创建临时分支
$ git checkout master
$ git checkout -b issue-101
- 3.修改完文件后
$ git add readme.txt
$ git commit -m “fix bug 101”
- 4.修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:
$ git checkout master
$ git merge --no-ff -m “merged bug fix 101” issue-101
- 5.Bug修复完后,切换到dev,并查看stash
$ git checkout dev
$ git stash list
- 6.恢复环境(方法一)
git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
$ git stash apply stash@{0}
- 7.恢复环境(方法二)
用git stash pop,恢复的同时把stash内容也删了
$ git stash pop stash@{0}
这两个方法中stash@{0}都可以省略,将会自动恢复
十三、Feature分支
最好是每添加一个新功能,在dev上新建一个feature分支,
然而有时候feature还没开发完毕要取消开发,
此时feature还没有合并到dev,无法删除此时则需要强制删除
git branch -D readme.txt
采用大写的D强行删除