Git命令笔记
1. 创建版本库
$ mkdir learngit $ cd learngit $ pwd #显示当前所在目录 /learngit
2. 初始化
$ git init
3. 添加提交
$ git add readme.txt #告诉git我们添加了readme.txt,可以多次添加,一次提交 $ git commit -m "版本说明"
关于添加和提交的一些说明
#git add 的各种区别: git add -A // 添加所有改动 git add * // 添加新建文件和修改,但是不包括删除 git add . // 添加新建文件和修改,但是不包括删除 git add -u // 添加修改和删除,但是不包括新建文件 #在 commit 前撤销 add git reset <file> // 撤销提交单独文件 git reset // unstage all due changes #add/commit 前撤销对文件的修改: git checkout -- README.md // 如果你误删工作区实体文件,可以通过这个命令,将master最新版本还原到工作区
3. 查看
$ git status #如果修改了文件,状态会提示你有文件被修改(但不能告诉你哪里被修改),提示你要commit $ cat readme.txt #查看实体文件的内容 $ git ls-files #查看哪些文件在版本控制下 ----------------------------------------------------------------------------------- 查看当前目录下有哪些远程仓库 $ git remote #远程仓库名字 $ git remote -v #verbose的缩写,显示详细信息,包括项目url 需要注意的是,当前Git Shell在不同目录下,git remote显示的远程仓库就不同 ----------------------------------------------------------------------------------- 查看提交的历史 $ git log --pretty=oneline --abbrev-commit ----------------------------------------------------------------------------------- 查看不同的地方(修改) $ git diff #是工作区(work dict)和暂存区(stage)的比较 $ git diff --cached #是暂存区(stage)和分支(master)的比较 意思就是说,我们修改文件并保存实体文件,可以使用git diff查看不同之处,再确定是否add到暂存区,保存到暂存区后可以用git diff --cached查看stage暂存区和master分支的不同之处,决定是否commit $ git diff HEAD -- readme.txt #比较工作区和master最新版本readme.txt的不同
4. git日志
这个显示从初始版本到当前版本的信息
$ git log #可以查看who在when修改了文件(会写出版本说明),但是这个看着眼花缭乱 $ git log --pretty=online #这样,每行只显示一次修改,修改信息只有:commitid + 版本说明
这个显示所有修改的日志
$ git reflog
5. 回滚到历史版本
#第一种方法 $ git reset --hard HEAD^ #HEAD是当前版本,HEAD^是上一个版本,HEAD^^是上上个版本,HEAD~100是前100个版本 #第二种方法 $ git reset --hard 04c632e244 #hard后面这一串字符是commit id,只要前面几位就ok,但是如果我们关掉git,想恢复到之前的新版本,但是不知道id了,那就要用第三种方法了 #第三种方法 $ git reflog #可以显示你所做的修改日志,最前面有id,然后再用第二种方法回滚
6. 撤销修改
6.1 撤销工作区修改用
$ git checkout -- readme.txt #注意--之后又空格 #第一种 #实体文件被修改,还没add #这个就会将工作区实体文件回滚到master最新版本 #第二种 #修改了一次,add到stage #然后又修改了工作区实体文件 #这个就会将工作区实体文件回滚到stage的版本
6.2 撤销暂存区修改
$ git reset HEAD readme.txt #master :1,stage:2 #意思是,已经修改了并add到stage,使用上面命令,可以撤销stage里的状态2(unstage),此时stage就回滚到master的状态1
6.3 撤销版本库的修改
参考 7.回滚到历史版本
7. 删除文件
$ rm readme.txt #删除工作区的实体文件
$ git rm readme.txt #删除工作区和暂存区文件,commit后版本库也将删除,如果不commit,版本库未删除,那么 git checkout -- readme.txt可以将版本库恢复到工作区。
8. 添加远程仓库并推送
$ git remote add [shortname] [url] #shortname是你命名的远程仓库名字,url格式如下:git@github.com:github_account/repository_name.git ----------------------------------------------------------------------------------------------------------------------------- $ git remote add learn_git git@github.com:wongbingming/my_repository.git #注意记得先在GitHub上先新建仓库,my_repository,不然后面推送会出错 $ git push -u learn_git master #learn_git是之前命名的远程仓库名,master是你要推送到的远程仓库的分支名字
9. 从远程库克隆
$ git clone [github url] #举例 $ git clone git@github.com:BingmingWong/test.git
10. 分支
10.1. 新建,切换,删除分支
git checkout -b dev #创建dev分支,把HEAD指针切换到dev # git check -b表示新建并切换,相当于下面两条命令 ------------------------ # git branch dev 新建 # git checkout dev 切换 ------------------------ # git branch 查看所有分支,*表示当前分支 # do something change,then add and commit git commit -m "sometext" #提交,生成新的 git checkout master #把HEAD指针重新指向master git merge dev #把dev合并到当前master分支 git branch -d dev #删除dev分支,删除是dev不能是当前分支,如果dev之前和远程仓库同步过,这次要删除前如果有修改需要先同步才能修改,不然需要用-D
10.2. 两个分支都修改了合并冲突问题
解决冲突
10.3. 合并分支
分支管理策略
# git merge 默认使用Fast Forward快速合并,这种不会留下合并信息 # git merge --no-ff -m "sometext" 由于不采用快速合并,会生成一次commit,所以需要-m 说明,这个好处可以查到合并信息
10.4. 本地分支与远程分支
1. 本地分支如果和远程分支同名,push时只要写一个分支名即可 2. 如果不同名,可以使用"git push -u origin local_branch_name:romote_branch_name"
11. 保存现场stash
# 背景设定 # 假如我们当前正在dev分支工作,但是master主分支有bug需要紧急修复,但是dev的工作才进行到一半,完成还需要一天,我们想在不提交的情况下,把bug修复好,改怎么做? #这时候就可以用git stash,保存 #然后切换到master修复bug,修复完成后再切换到dev #使用"git stash list"查看保存的list #那就使用命令"git stash pop"(如果list中有多个stash,可以使用git stash apply stash@{1}) #"git stash pop"(在恢复的时候,同时把stash内容也删了)=="git stash apply"(恢复)+"git stash drop"(删除stash内容)
12. vi的使用
1. 进入vi模式后,先按I,切换成插入模式 2. 修改文本内容 3. 按Esc,退出插入模式 4. 键盘敲":x",保存并退出
13. 标签
标签的意义 1. 标签的作用相当于commit ID 2. 区别在于commit ID是机器生成的,不便于记忆和可读性,tag是人为设定的,有特殊意义,有很强的可读性 如何打标签 首先切换到你要打标签的分支上,通常是master $ git tag v1.0 #给当前分支打上v1.0的标签 $ git tag v1.0 6a5819e #如应该在之前版本打的标签没打,可以这样补打 ------------------------------------------------------------------------------- $ git tag #显示当前分支的所有标签 $ git show v1.0 #查看v1.0的信息:commit ID,Author,Date -------------------------------------------------------------------------------- $ git tag -a v1.1 -m "version 1.1 released" 3628164 # -m 添加说明文字,-a v0.1:使用git show v1.1,有tag的信息 标签不自动push到远程 若要push,可以使用命令 $ git push origin v1.0 #推送单个tag $ git push origin --tags #一次性推送所有tag 删除标签 1. 本地删除 $ git tag -d v1.0 #删除标签v1.0 2. 远程删除(如果已经推送到远程,要先本地删除,再远程删除两个步骤) $ git push origin :refs/tags/v1.0 #要查看是否远程删除了,可以上GitHub上看
14. GitHub代码更新合并到本地
$ git merge origin/master
15. 创建SSHkeys
$ ssh-keygen -t rsa -C "youremail@example.com"
一路回车然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码
然后就会生成id_rsa
和id_rsa.pub
两个文件
其中id_rsa是私钥,不能泄露
id_rsa.pub是公钥,可以放心告诉别人,而我们也只需要这个公钥,来连接我们GitHub。
创建完成后,使用如下命令查找位置
$ find / -name id_rsa.pub