git常用命令
- git不会上传空文件夹,所以一般我们为了保持文件夹能正常上传,会在文件夹内创建一个
.gitkeep
(保持git上传,意思是这个文件夹我要提交上去)的文件来保证文件夹被上传上去。
- 在远端仓库fork别人的代码就相当于复制一份到自己的仓库,你的修改并不会影响被fork的代码。好处在于我修改fork的代码就有权利提交过去,他们就能接到通知,只要那边审核通过,可以将我修改的代码合并到对方的代码中去(做开源项目常用)。
- 在git服务端一样有本地端相似的命令,可以提交给被fork的人的项目中去。
$ git <命令> --help ## 打开对应命令的离线文档,列出来的很详细
$ git <命令> -h ## 查看当前命令的用法,列出常用的,不详细
$ git init ## 初始化文件目录为git所管理,会创建一个.git目录,存储git管理的基本信息。
$ git status ## 查看git管理文件的状态。status命令会经常使用,它能提示你很多信息,需要注意观察。
On branch test ## 当前所在的分支
Your branch is behind 'origin/test' by 1 commit, and can be fast-forwarded.## 提示当前分支有一处提交(来着origin远端仓库)
## 下面的提示信息是提示你接下来可以用哪些命令
(use "git pull" to update your local branch) ## 提示拉取远端仓库信息到本地
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: app/.eslintrc
modified: build/config/webpack.path.js
modified: client/.eslintrc
$ git checkout -- <file> ## 修改后还未提交值暂缓区(未 add)。可以使用通配符(撤消后无法在找回数据)。
$ git add . ## add只是添加到了 暂存区。
warning: LF will be replaced by CRLF in 1.txt.
The file will have its original line endings in your working directory.
## LF表示换行符号,CRLF是Carriage-Return Line-Feed的缩写,意思是回车换行,就是回车(CR, ASCII 13, \r) 换行(LF, ASCII 10, \n)。换行在有的ASCII码表也用newline(简nl)来进行表示,这里的lf是line feed的概念,意思是一样的。 将LF格式的替换成CRLF格式的。
$ git add <文件|文件夹>
$ git rm --cached <file> ## 将add进 暂存区 的文件给移除掉。(不常用)
$ git rm --cached .
fatal: not removing '.' recursively without -r ## 提示失败,这里提示的是如果先批量删除需要追加一个 -r ,如下:
$ git rm --cached . -r ## 表示递归删除所有
$ git commit -m '消息' ## 提交至本地 git 的版本库中,如果不加-m消息的话,会用vi编辑器提醒你去写入一个消息,如果不写入会中断此次的提交(空的字符串也会被中断)。 commit后会被添加到 Git 仓库。 填写好消息(-m)有利于后期代码回滚/维护/找回
## 如果之前文件 add 过一次,再次修改工作区的文件想直接跳过 add 的操作可以如下:
$ git commit -a -m "消息" ## 此命令只会提交之前add的文件,没有被add的文件不会提交到本地的git仓库中去。
## 比较暴力的覆盖,表示会将暂存区和工作区的文件都给覆盖掉。
$ git reset HEAD <file> ## 撤销指定提交的文件。(常用, add/commit后都可以使用,commit后需要指定 版本号)
$ git reset --hard <commit 版本号> ## 将本地git仓库中的文件还原到指定的commit提交的位置,commit 版本号 不必复制完整 7~10位即可。可以撤回某一个提交节点也可以恢复至当前。reset后本地的commit日志也会被回滚到还原的位置。 --hard表示坚决的意思。
HEAD is now at 71befda 提交数据 ## 提示信息为当前已经到了 某个commit提交的位置,再看文件也是那一次提交的数据信息。
$ git reset --hard HEAD^ ## 根据头信息往上一步回滚。回到上一次记录
$ git reflog ## 可以打印出所有的日志,包括移动的,删除的,可以采用这个来回到reset之后不能回到的节点。这个记录也仅仅只是被操作后的记录信息。第一个记录的是 版本 号,依然可以使用 git reset --hard <版本号> 回滚到之前的某一步操作
71befda HEAD@{0}: reset: moving to 71befdabfa048d
72f5d07 HEAD@{1}: reset: moving to 72f5d07ce7cda17dd
71befda HEAD@{2}: reset: moving to 71befdabfa048d
72f5d07 HEAD@{3}: commit: 第三次
058df75 HEAD@{4}: commit: 测试diff
71befda ## 第一个为 版本号
HEAD@{5}: commit (initial): 提交数据 ## HEAD表示头信息 操作顺序(最后操作的排在最前面)和操作命令以及相关信息。
$ git log <|commit 版本号> ## 越后提交,排在最前面,如果传入commit 版本号 则会查找出指定的commit 版本号 的内容。
commit 71befdabfa048ddd21e4e16631a8271a13ed7fd0 ## 提交的commit 版本号,可以用在后面的恢复等操作
Author: xxx <xxxxx@xxx.com> ## 提交的作者,这里读取的是全局配置的config文件中的信息
Date: Sat Jun 29 14:29:36 2019 +0800 ## 提交的时间
提交数据 ## commit 时输入的信息 -m 后面输入的信息。
## 注意:当log数据过多的时候会出现:(提示输入命令),在键盘上按上下键表示翻页。按q键表示退出。
$ git log --graph ## 显示合并的图谱
$ git diff <|文件> ## 添加 文件 则会对比指定文件,不添加则会递归对比。如果没有修改则不会对比。默认对比的是工作区中的文件和暂存区的文件。
$ git diff <分支名> <|文件名> ## 和上面的规则一样,这次比较的是本地的Git 仓库上的文件
$ git diff origin/<分支名> <|文件名> ## 和上面的规则一样,这次比较的是远程Git 仓库上的文件,origin表示 源头,也就是服务器端的数据
$ git diff --cached <|文件> ## 和上面的规则一样,这次比较的是拿暂存去和本地Git 仓库去比较
$ git branch ## 查看分支,默认只显示本地的分支,第一次创建只有当你commit之后才会显示分支信息
feature/a-dev-branch
master
* test ## * 表示当前的分支
$ git branch -a ## 查看所有的分支,包括远端分支,远端分支的名称是红色字体显示,本地分支是白色字体显示。
$ git branch <分支名称> ## 创建一个分支,从master分支上复制一份到新建的分支上去,如果存在对应分支则会给出对应的提示。从commit的那一步操作开始分支和master才没有任何关系了(切换后commit的信息不再另一个分支上有了,当两个分支没有关系的时候修改后直接切换会提醒你先commi在切换,否则修改的文件会有被覆盖的危险)。
$ git branch -D(-d) <分支名称> ## 删除指定的分支,不能在当前分支上删除当前分支,需要切换到其他分支再去删除。
Deleted branch dev2 (was 72f5d07).
$ git checkout <分支名称> ## 切换到对应的分支上。如果本地有新文件,新文件依然存在,如果有未提交的文件,则会提醒你有修改的文件,修改后的文件依然被带到切换后的分支中去。
M 1.txt
Switched to branch 'dev2'
$ git checkout -b iss53 ## 先创建分支,并同时切换至该分支
Switched to a new branch 'iss53'
## 切换并指定远程分支(远程分支必须存在)
$ git checkout -b iss53 origin/分支名
Switched to a new branch 'iss53'
### 这相当于执行下面这两条命令:
$ git branch iss53
$ git checkout iss53
$ git stash ## 表示把我当前写完的代码给暂存取来,常用在切换分支之前不想add/commit,可以使用该命令暂时存储起来(暂存后,文件会回滚到上一次,方便去做切换分支等操作)。
$ git stash -h ## 查看stash 所有可供选择的参数
usage: git stash list [<options>] ## 显示当前暂存的列表,暂存后才会有list信息
or: git stash show [<stash>] ## 显示当前暂存文件和目前文件的差异
or: git stash drop [-q|--quiet] [<stash>] ## 删除list中的所有信息,也就是删除暂存后的文件信息
or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>] ## 将暂存文件还原,应用回来。会删除掉list列表中的记录
or: git stash branch <branchname> [<stash>]
or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [<message>]]
or: git stash clear
$ git merge <分支名> ## 将指定的分支文件合并到当前分支上。
## 当合并冲突时,会提示你如何阶级
$ git merge master
Auto-merging 1.js
CONFLICT (content): Merge conflict in 1.js ## 1.js中的合并冲突
Automatic merge failed; fix conflicts and then commit the result. ## 提示你去修复冲突的内容,修复完毕后去commit你修复后的文件(需要先 add 进缓冲区)。
#### 冲突后的文件
<<<<<<< HEAD ## 这里表示你修改的部分(当前的分支)
var name = '测试账号';
======= ## 这里表示合并过来的master分支上的内容。====是分隔符。删除掉其中一个即可,或者两个都保留去掉<<<< >>>> 这些提示信息
var name = 'laoxu';
>>>>>>> master
#### 修改过后如下
var name = 'laoxu';
$ git remote -h ## 对远程分支的配置及操作
usage: git remote [-v | --verbose] ## 查看配置的远程,fetch表示可拉取的,push表示可推送的。
or: git remote add [-t <branch>] [-m <master>] [-f] [--tags | --no-tags] [--mirror=<fetch|push>] <name> <url> ## 添加远程分支 需要起别名然后对应远程的url地址
or: git remote rename <old> <new> ## 修改 remote 配置中的某一项别名
or: git remote remove|rm <name> ## 删除对应别名的远程分支(rm 是 remove的简写)
or: git remote set-head <name> (-a | --auto | -d | --delete | <branch>)
or: git remote [-v | --verbose] show [-n] <name>
or: git remote prune [-n | --dry-run] <name>
or: git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]
or: git remote set-branches [--add] <name> <branch>...
or: git remote get-url [--push] [--all] <name>
or: git remote set-url [--push] <name> <newurl> [<oldurl>]
or: git remote set-url --add <name> <newurl>
or: git remote set-url --delete <name> <url>
-v, --verbose be verbose; must be placed before a subcommand
$ git push origin <分支> ## origin 是上一步remote远程配置的别名对应远程url。表示推向远程某url上的某一个分支上面去。
## 如果你在push提交的时候,远程仓库提交的commit次数(指针)始终比你本地的多,那么就回提醒你提交失败,并让你先做pull的操作。
$ git clone <url项目地址> <|项目别名> ## 把远程代码克隆都本地,默认情况下项目的名字就是远程分支上的名称。
$ git fetch -h ## 取的git远程仓库中的分支
usage: git fetch [<options>] [<repository> [<refspec>...]]
or: git fetch [<options>] <group>
or: git fetch --multiple [<options>] [(<repository> | <group>)...]
or: git fetch --all [<options>]
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。