1. git 常用命令
-----------------------------------------------------------------------------------------------------
* git init
创建一个本地git仓库,如果你没有服务器,但想用git来管理本地代码,可以创建一个本地git仓库
除了没有git push到远程服务器的操作外,其他都与正常git使用无异,对于本地代码开发管理挺实用的。
例如: cd myRepo ; git init 这样将你的代码文件放到myRepo,然后就可以git add, git commit等git操作
* git add
将文件添加到git仓库,留意这3个参数区别 . -u -A
git add . 会将所有变化提交到暂存区,包括内容修改modified,新文件new,但不包括被删除的文件
git add -u
会将被跟踪的文件(tracked file)的改动提交到暂存区,但不会提交新文件(untracked file)
git add -A
是上面两个的集合
* git status
查看状态,会把当前仓库下所有tracked和untracked都显示出来
但有时候那些.o, .ko等编译产生的文件我们不希望也显示出来干扰,可以在仓库目录下创建 .gitignore
并把这些文件用通配符表示在该文件中,一行一种类型,比如
vi
.gitignore
*.o
*.ko
这样在用 git status 时就不会再将这些无关文件显示出来了
* git clone
将远程git仓库克隆一份到本地,相当于svn check out
git clone
git_url
例如: git clone git@git.baidu.com:software/trunk_wl.git
* git remote show origin
获取远程git仓url地址,如下不仅可以知道该远程git仓地址,还可以知道它有哪些branch
*
git branch
** 查看当前git仓有多少个branch,当前正在哪个branch:
git branch -a
** 删除本地分支:
git branch -D br_name
** 如何知道本地分支跟踪关联远程仓库上到哪个分支
: git branch -vv
* git checkout
** 切换分支,
git checkout -b <new_branch> <start_point>
比如通过git branch -a 知道当前正在master分支上,同时仓库还有nexus_ftl_staging_a分支
** 上面-b是在本地分支还未创建到情况下,如果本地分支已经有了,比如有本地分支A和B,要切到A上
就只需要 git checkout A
** 切换到某个tag上
通常做法是建一个分支,然后把tag拉到这个分支上,用法:
git tag
查看当前有哪些tag,比如有 v2.7
git checkout -b tag_br v2.7
将tag 2.7拉到新到分支 tag_br上
** 从指定某笔提交创建分支
git checkout -b <new-banch> <commit-id> // 从指定<commit-id>上创建分支new-banch
* git log
** 查看每次提及的差异内容:
git log -p -2
-2 是查看最近2次的提及差异,-p显示差异内容
* git patch
介绍git下产生和应用patch的方法:
http://blog.youkuaiyun.com/maybe_windleave/article/details/8703778
** 生成patch:git diff > patch 对应应用此patch可以用命令:git apply patch
在应用这个patch之前如果不放心它是否能全部打上去,可以用 git apply --check patch 先检查,没有任何输出表示没问题
** git log -5 >> 查看最近5笔提交
git diff <commit-id.x> <commit-id.x+1> > patch >> 根据commit id找出想要到某两笔之间到修改差异,保存为 patch
** git show <commit-id> > patch
>> 根据commit id找出某笔修改差异,保存为 patch
* git fetch 和 git pull 和 git push
从远程分支获取最新版本到本地,git fetch 从远处获取最新版本到本地,但不会自动merge.
git pull 是从远程获取最新版本并merge到本地。
** 用法:
git branch >> 先看看本地是那个分支,假定是 master
git fetch origin master:tmp >> 从远程origin仓库master分支获取最新版本到本地,但没merge到本地,只是先放到临时开到tmp分支
git diff tmp >> 可以看到远程master分支上最新版本跟本地master分支到差异
git merge tmp >> 将差异merge到本地
git branch -D tmp >> 删除临时tmp分支
如果本地是干净到,只是要跟远程做下同步,那么可以用 git pull origin master 它相当于 git fetch origin master:tmp + git merge tmp
在实际使用中,建议用 git fetch,它可以在merge前查看更新情况,再决定是否合并
** git pull <远程主机名> <远程分支名>:<本地分支名>
git fetch / git pull 是从远程分支同步代码到本地,git push 是将本地commit到修改推送到远程分支
** git push 用法:
git status
看看本地commit跟远程分支上有哪些改动,会看类似:
Your branch is ahead of 'origin/nexus_ftl_staging_a' by 2 commits.
(use "git push" to publish your local commits)
git push origin master:master 其中 origin是远程主机名,master是本地分支名,后面这个master是远程分支名
可以通过git remote 查看远程主机名,git branch 查看本地当前分支名,通常本地分支名取与远程分支名一样
所以上面可以简写成: git push origin master 即git会自动根据本地分支名去查找远程同名分支,若没找到会自动创建一个新分支
推荐完整写上本地分支名和远程分支名
* git diff
查看工作区文件跟上次提交快照到差异,可以直接用
git diff <file>
如果某个文件已经git add到暂存区,但还为commit,即要查看暂存区文件跟上次提交快照到差异,可以用
git diff --cached
<file>
* git reset
已经commit到某笔提交,想要撤销: git reset --hard HEAD^ (HEAD^是上一次提交,HEAD^^上上次提交,也可以写成HEAD~2,依次类推)
--hard会撤销到比较彻底,本地文件也会被删除.
* git config
查看当前提交人信息:git config --list
主要是 user.email 和 user.name 这两个信息,可以这样修改:
git config --global user.email "shang.zhang@baidu.com"
git config --global user.name "shang.zhang"
git config --global credential.helper store // 保存用户名密码,不用每次都输入
* git stash
git stash可用来暂存当前正在进行到工作,比如切换一个分支,如果当前有修改会提示你先提交,但这时又不想提交,就可以用git stash
先将这些修改隐藏起来。待在切换后到分支上工作完成后要切回来,回到之前到哪些修改,就可以用 git stash pop 恢复当时隐藏到修改
git stash 隐藏修改
git stash pop 恢复修改
* git archive
如何将某个tag文件全部导出(不带仓库管理文件),有时候要导出一份干净的仓库代码,就会需要用到这个命令
如果你的tag名是 v2.7 (可以先用 git tag 查看当前有哪些tag), 可按如下方式导出:
** 导出并压缩为 zip 格式: git archive --format=zip --output=v2.7.zip v2.7
** 导出并压缩为 tar.bz2 格式: git archive v2.7 | bzip2 > v2.7.tar.bz
** 导出并压缩为 tar.gz格式: git archive --format=tar v2.7 | gzip > v2.7.tar.gz
* git revert
撤销已提交的修改。加入一笔已经push的修改要撤销,可以这么做:
git revert <commit-id> // 要先确保本地是干净的,<commit-id> 是指定要撤销的某笔提交
git push origin 远程分支名:本地分支名 // revert后重新提交,这一步让本地和远程都同步 revert
其实相当于重新提交了一笔修改,这笔修改的内容就是去掉要撤销的内容.
与 git reset的区别是 revert 可以留下提交痕迹,而reset则是删除,不留痕迹
* git bash
git bash是windows下用的git 命令行工具.
#1. git bash 执行很慢的问题
>> git bash默认会去查找windows文件服务器,比如/h/bin,这就导致很慢。查找路径有HOME变量定义
可以将HOME变量添加到windows系统用户变量中,比如我的win10是这么添加的
我的电脑 右键 -- 属性 -- 高级系统设置 -- 环境变量 -- 在用户变量中新建 HOME = C:\Program Files\Git\etc\profile.d
关闭git bash,重新打开后就明显快乐很多