一 说明
git 是linus为了控制linux内核版本而开发的一款分布式版本控制器。版本控制器分为两类:集中式和分布式。
集中式需要设置中央服务器,工作时需要联网,本地并没有仓库,提交较慢。 而分布式的每个本地都有一份仓库,
中央服务器只是方便大家交换文件,不用联网也可工作
二:常用命令总结
2.1 安装git
debian/ubuntu:
$ sudo apt-get install git
其他系统:先输入git, 如果没有下载,会提示下载方式。
2.2 建立仓库
git init
$ mkdir program
$ git init
NOTE:新建一个文件夹,然后在文件夹里执行这个命令,就把该文件夹初始化成了一个版本库,在本文件夹中会产生一个隐藏的.git 文件夹,里面放的是版本控制库相关的信息,不要轻易修改,否则会出错。
本命令用于在本地初始化仓库。
git clone
$ git clone git://git.kernel.org/pub/scm/.../linux.git
NOTE:会把远程的仓库克隆到本地,一般会产生一个文件夹,这个文件夹就是仓库,克隆的和远程仓库一模一样的仓库。
2.3 用户名,邮箱,编辑器配置
git config
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ git config --global core.editor "vim"
NOTE:加–global设置本机全部仓库用户名和email都是这个。
$ git config user.name "Your Name"
$ git config user.email "email@example.com"
NOTE:不加–global是设置单个仓库的用户名和邮箱,但是此命令必须在git仓库文件夹里执行。
$ git config user.name
$ git config user.email
$ git config core.editor
NOTE: 这样就可以查看git仓库的用户名和邮箱了,在单独的git 仓库文件夹中,输出的是当前git 仓库的信息,
在仓库外面,就是全局git 仓库设置的信息了。这里面包含了一个作用域的问题,不在特定的git 仓库下,输出的都是
全局git 仓库信息,在特定的git 仓库下,就是当前git 仓库的信息。
2.4 本地修改
git status
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CMakeLists.txt
modified: src/modules/example_module/CMakeLists.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
config.json
launch.txt
NOTE: 该命令会输出当前仓库所处的状态,修改了那些文件,新增加了那些文件,注意看英语提示即可。
git diff
在学习git diff 之前,我们需要理解以下git 的几个区域设置,工作区,暂存区,本地版本库,远程版本库。
工作区:当前git 仓库目录,就是你工作的地方,修改的地方。
暂存区:修改完,或者增加完文件,需要先把文件放到暂存区,一般通过git add命令进行一个或多个文件添加。
本地版本库:在暂存区的文件可以通过提交的方式,git commit 一次性提交到本地的版本库,会产生commit id。
git diff [path/filename]
NOTE: 比较工作区和暂存区之间的变动,可以指定文件名,也可以不指定,不指定指全部修改。
git diff --cached [path/filename]
NOTE: 比较暂存区和最新版本的区别。
git diff commitId [path/filename]
NOTE: 比较工作区和版本库中的commit id 的区别。
git diff --cached [<commit-id>] [<path>...]
NOTE: 比较暂存区和工作区指定commit id 的区别
git diff [<commit-id>] [<commit-id>]
NOTE: 比较两个commit id 之间的差别,就加一个commit id 比较的是工作区和暂存区。
NOTE:一般只需要用git diff 查看目前修改,提交到本地之后 git diff HEAD^ HEAD 进行比较即可。关于以什么为参考,我只能告诉你,git diff HEAD^ HEAD 参考是 HEAD^
git add
git add filename....
NOTE: 添加修改的文件到暂存区
git add -A
NOTE: 添加当前文件夹下所有被修改或添加的文件到暂存区。
git add -u
NOTE: 添加所有tracked 文件地修改到暂存区。
git commit
git commit -s
NOTE: 提交并签名
git commit -m "message"
NOTE: 提交,把信息message 作为commit info
git commit --amend
NOTE: 修改提交,不会再产生一个新的commit
git config --global core.editor "vim"
NOTE:配置编辑信息的软件为vim
git stash
git stash save "message"
NOTE: 暂时保存目前的进度,并写一些标志信息。
git stash list
NOTE:查看所有的stash,stash@{0}是标志,pop或者apply的时候要用。
git stash pop [stash id]
NOTE:把指定的stash id 恢复到工作区。不指定则把最新的工作状态恢复到工作区。然后删除该stash. 所谓最新的就是stash list 所列出的第一个。
git stash apply [stash id]
NOTE:除了不删除stash外,其他与git stash pop都一样。
git stash drop [stash id]
NOTE:删除指定的stash,若不指定stash id ,则删除最新的。
git stash clear
NOTE:删除所有的stash
2.5 提交历史查看
git log
git log
NOTE: 直接用即可,会输出版本库。
2.6 分支和标签
git branch
git branch
NOTE: 获得当前本地仓库的分支列表
git branch -r
NOTE: 查看远程版本库分支列表
git branch -a
NOTE: 输出本地和远端的所有分支
git branch branch1
NOTE: 生成一个新的branch, 名字叫branch1
git branch -d branch1
NOTE: 删除一个名为branch1的分支
git branch -vv
NOTE: 输出本地分支与之相对应的远程分支
git branch -m oldname newname
NOTE: 修改分支名
git checkout
git checkout branchName
NOTE: 切换到分支名为branchName的分支。
git checkout -b branchName
NOTE: 如果存在,就只切换分支,如果不存在则建立一个分支并切换。
git checkout filename
NOTE: 放弃对文件的修改,用暂存区里的相同的文件覆盖工作区。
git checkout .
NOTE: 放弃当前目录下所有文件的修改。
git tag
TODO
2.7 更新和发布
git remote
git remote
NOTE: 不带任何参数,将会输出远程主机
git remote -v
NOTE: 可以查看远程主机的网址
git remote show <主机名>
NOTE: 命令加上主机名,可以查看该主机的详细信息
git remote add <主机名> <网址>
NOTE: 添加远程主机,统一项目放在了不同主机,两份,这个 时候就可以添加远程主机了。
git remote rm <主机名>
NOTE: 命令用于删除远程主机
git remote rename <原主机名> <新主机名>
NOTE: 重命名主机名
git fetch
git fetch <远程主机名>
NOTE: 这样会把远程主机的所有更新拉到本地,只是单纯的拉到本地,对本地分支没有任何影响
git fetch <远程主机名> <远程分支名>
NOTE: 把远程主机的该分支拉到本地,拉特定分支。所取回的更新,在本地主机上要用远程主机名/分支名方式读取。
git checkout -b newBranchName 远程主机名/分支名
NOTE: 这样就代表,在远程取回的该分支基础上建立一个新的本地分支。
git pull
git pull <远程主机名> <远程分支名>:<本地分支名>
NOTE: 拉远程分支并合并到指定本地分支
git pull <远程主机名> <远程分支名>
NOTE: 拉远程分支合并到当前本地分支
git push
git push <远程主机名> <本地分支名>:<远程分支名>
NOTE: 将本地分支推送到远程分支,若远程分支不存在,则会创建。
git push --force <远程主机名> <本地分支名>:<远程分支名>
NOTE: 将本地分支强制推送到远程分支,若远程版本比本地版本新,则会覆盖。
2.8 合并和变基
git merge
git merge <branch-name>
NOTE: 把名为branch-name 的分支,合并到当前分支。
git cherry-pick
git cherry-pick <commit-id>
NOTE: 把指定的commit-id合并到当前的分支,若有冲突就需要修改,修改成自己想要的形式,
然后git add , git commit ,提交新的commit. 该命令的主要左右就是把指定commit-id , 无论是哪个分支
上的,都可以合并到本分支。
git rebase
git rebase <branch-name>
NOTE: 以branch-name 为branch名的branch,为基,重新设置base
NOTE:整体流程:
git rebase ---> 存在冲突,rebase停止,解决冲突---> git add (无需commit)
--->git rebase --continue -->想中途停止,git rebase --abort
2.9 撤销
git reset
git reset --hard <commit-id>
NOTE: 回退到指定commit-id版本,并舍弃修改的文件
git reset --soft <commit-id>
NOTE: 回退到指定的commit-id版本,但不舍弃修改的文件,而是放置在暂存区。
git revert
git revert <commit-id>
NOTE: 撤销该次提交,并把这次撤销操作再产生一个commit, 和reset 的区别就是,reset 是直接把该
commit 去掉,而revert则是单纯的删除这次提交的内容,并生成新的提交,而之前的commit还是存在的。