Git学习笔记

一.基本命令

1.init 创建版本库

git init

把这个目录变为git可以管理的仓库,会生成.log文件夹 可以用ls-ah查看。

2.add 添加文件到暂存区

git add <file> :添加单文件

git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add —update的缩写)
git add -A:是上面两个功能的合集(git add —all的缩写)

总结:

  • git add -A 提交所有变化
  • git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
  • git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

4.commit 提交到版本库

git commit
git commit -m <message> 添加单行注释<message>

4.status 查看工作区状态

git status
如果git status告诉文件修改过,可以用git diff查看修改内容

5.log 查看修改过的历史记录

git log
git log --pretty=oneline 单行输出

关于log与reflog
1.git log 命令可以显示所有提交过的版本信息
2.git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
例如执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid,我们就可以买后悔药,恢复到被删除的那个版本。

6.clone 克隆仓库

git clone <url>
git clone -b <branchname> <url> 克隆指定分支

7.reset 回退版本

git reset --hard HEAD :退回到版本库中的当前版本(清除工作区和暂存区)
git reset --hard commit_id:根据<commit_id>退回版本。
git reset HEAD <file>:撤销指定文件的add操作

拓展:

有时候,进行了错误的提交,但是还没有push到远程分支,想要撤销本次提交,可以使用git reset –-soft/hard命令。
1、二者区别:
git reset –-soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;
git reset -–hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉;
总结:
git reset —soft 跳转到指定版本、不还原缓存区、不还原工作区
git reset 跳转到指定版本还原缓存区、不还原工作区
git reset —hard 跳转到指定版本还原缓存区还原工作区

8.branch 分支

git branch (branchname):创建分支

git branch:查看本地分支
git branch -a:查看本地和远程仓库的所有分支
git branch -r:查看远程分支
git branch -d (branchname):删除分支
git branch -m <oldbranch> <newbranch>: 重命名本地分支
git checkout (branchname):切换分支
git checkout HEAD^ (HEAD~4):切换到上一个分支(上面4个)
git checkout -b (branchname) :创建并切换
git merge:合并分支
git merge --no-ff -m "merge bug001" bug001
合并master分支和bug001分支。(—no-ff参数,表示禁用Fast Forward模式,禁用后Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息)

9.checkout 撤销操作

git checkout -- file :可以丢弃工作区的修改:git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

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

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

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

总之,就是让这个文件回到最近一次git commitgit add时的状态。

10.diff 查看区别

git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别
git diff [file]
显示暂存区和工作区的差异
git diff --cached [file]$ git diff --staged [file]显示暂存区和上一次提交(commit)的差异
git diff [first-branch]...[second-branch] 显示两次提交之间的差异

11.remote 远程仓库

git remote add <name> <url>添加远程仓库

git remote add origin git@github.com:yourname/learngit.git
origin为远程仓库名

git remote -v查看远程库信息
git remote rm <name> 删除远程库

拓展:
1)修改远程仓库地址
方法有三种:
1 修改命令
git remote set-url origin [url]
我这里使用 git remote set-url origin [url]命令,直接修改远程仓库为https的地址
2 先删后加
git remote rm origin
git remote add origin [url]
3 直接修改config文件
2)删除远程分支
首先删除本地分支:
git branch -d dev
删除远程仓库分支:
git push origin --delete dev

12.push 推送到远程仓库

git push origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

git push -u origin master

如果远程库是空的,我们第一次推送master分支时,可以加上-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

命令参考
git push origin master
git push <远程仓库名> <本地分支名>:<远程分支名>
git push <远程仓库名> <远程分支名>

13.pull 拉取远程仓库

git pull <远程主机名> <远程分支名>:<本地分支名>

git pull origin master:brantest
将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并

git pull origin master
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

拓展:

fetch与pull
fetch是将远程主机的最新内容拉到本地,不进行合并
git fetch origin master
pull 则是将远程主机的master分支最新内容拉下来后与当前本地分支直接合并 fetch+merge
git pull origin master
下载分支上的内容
git pull origin 分支名
git merge [origin]/[branch]
git fetch origin
git merge origin/master

14.Stash 保存工作区

stash可以把当前工作现场“保存”起来,等以后恢复现场后继续工作。

保存工作现场:git stash
恢复工作现场。git stash pop

注:可以多次用命令git stash 保存工作现场,然后用git stash list 查看保存的列表,然后用 git stash apply恢复。

用 git stash apply恢复后,保存的现场并不删除,需要用git stash drop 删除。

常用git stash命令:
(1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
(2)git stash list :查看stash了哪些存储
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear :删除所有缓存的stash

15.submodule 子模块

开发过程中,经常会有一些通用的部分希望抽取出来做成一个公共库来提供给别的工程来使用,需要使用submodule

添加子模块
为当前工程添加submodule,命令如下:
git submodule add 仓库地址 路径
其中,仓库地址是指子模块仓库地址,路径指将子模块放置在当前工程下的路径。
注意:路径不能以 / 结尾(会造成修改不生效)、不能是现有工程已有的目录(不能順利 Clone)

删除
submodule的删除稍微麻烦点:首先,要在“.gitmodules”文件中删除相应配置信息。然后,执行“git rm –cached”命令将子模块所在的文件从git中删除。

下载的工程带有submodule
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
git submodule update --init --recursive
即可将子模块内容下载下来后工程才不会缺少相应的文件。

常用命令
git clone <repository> --recursive 递归的方式克隆整个项目
git submodule add <repository> <path> 添加子模块
git submodule init 初始化子模块
git submodule update 更新子模块
git submodule foreach git pull 拉取所有子模块

二.其他专题

1.git 从远程仓库获取所有分支

git clone只能clone远程库的master分支,无法clone所有分支,解决办法如下:

找一个干净目录,假设是git_work
cd git_work
git clone http://myrepo.xxx.com/project/.git ,这样在git_work目录下得到一个project子目录
cd project
git branch -a,列出所有分支名称如下:
remotes/origin/dev
remotes/origin/release
git checkout -b dev origin/dev,作用是checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支
git checkout -b release origin/release,作用参见上一步解释
git checkout dev,切换回dev分支,并开始开发。

2.为什么git无法按路径进行硬/软重置?

https://www.codenong.com/11200839/

3.Git之Checkout使用

情况一:未使用 git add 缓存代码时:

1
2
3
4
// 放弃单个文件修改,注意不要忘记中间的"--",不写就成了检出分支了!
git checkout -- filepathname
// 放弃所有的文件修改
git checkout .

此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。

情况二:已经使用了 git add 缓存了代码:

可以使用 git reset HEAD filepathname (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所有的缓存可以使用 git reset HEAD . 命令。

此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了如(一)所示的状态。继续用(一)中的操作,就可以放弃本地的修改。

情况三:已经用 git commit 提交了代码:

可以使用 git reset --hard HEAD^ 来回退到上一次commit的状态。
此命令可以用来回退到任意版本:git reset --hard commitid **

你可以使用 git log 命令来查看git的提交历史。git log 的输出如下,之一这里可以看到第一行就是 commitid

参考资料

可视化Git学习
Git菜鸟教程
廖雪峰Git教程