git教程:
http://rogerdudler.github.io/git-guide/index.zh.html
工作流:
本地仓库由 git 维护的三棵“树”组成。第一个是你的 工作目录,它持有实际文件;第二个是 暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。
创建新仓库
创建新文件夹,打开,然后执行git init
以创建新的 git 仓库。设置用户名和邮箱
1
2
3git config --global user.name xiaoyue26
git config --global user.email 296671657@qq.com
git config --global color.ui true
在项目目录下ls -a
查看隐藏的git配置文件
修改.gitignore文件,例如在里面另起一行,添加:*.zip
,则可以忽略zip后缀名的文件。
1 | -- 忽略除了lib.a以外的.a后缀文件 |
git status
命令看到的绿色的就是已经stage的文件,
红色的就是还没有git add
的文件(unstaged)。
## unstage 删除远端没有 本地stage的文件。
1 | git rm --cached <file>... |
暂存(慎用)
想暂存到目前为止作出的修改,但是不想提交到版本库,git提供了一个命令git stash,所有修改会提交到栈中
git commit 的时候把时间改成明天:
1 | -- 网上查到明天的unix时间戳是1451750400 |
撤销最后一次commit:
git reset --soft HEAD~1
从远端还原一个文件:
git checkout config.rb
查看远端信息:
1 | git remote -v |
向本地仓库添加远程版本库,名叫origin
git remote add origin https://github.com/githug/githug
合并分支,我们可以使用rebase,这个题目里,本地master提交了Thrid commit,而远程分支也提交了Fourth commit,现在需要把远程更新合并到本地,可以使用下面的命令。
1 | git rebase origin/master |
查看config.rb
文件每一行的作者:
git blame config.rb
##检出仓库
执行如下命令以创建一个本地仓库的克隆版本:
1 | 如果是远端服务器上的仓库,你的命令会是这个样子: |
用git定位代码从哪一次commit后开始出错:
原理:二分查找
背景条件:
ruby prog.rb 5
命令在当前代码条件下应该返回正确答案15.- 从过去的某一次commit后的代码之后,这个结果就错了。
现在要用git bisect找出到底是哪一次之后就出错了。
1 |
|
##添加和提交
你可以提出更改(把它们添加到暂存区),使用如下命令:
1 | git add * |
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
1 | 现在,你的改动已经提交到了 `HEAD`,但是还没到你的远端仓库。 |
可以把 master 换成你想要推送的任何分支。
如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
1 | 如此你就能够将你的改动推送到所添加的服务器上去了。 |
上述都是在当前代码基础上创建分支,也可以在任意一次commit的基础上创建分支:
1 | # 先查看commit的hash标记 |
切换回主分支:
1 | 查看当前分支情况:(类似git status) |
切换到feature分支:
git checkout feature
查看log树:
git log
找到添加和修改想要文件那次commit的hash ca32a6…
切换回master分支:
git checkout master
提取文件:
git cherry-pick ca32a6dac7b6f97
1 |
|
往前倒到上两次的:
git rebase -i HEAD~2
把pick改成reword,并修改注释。
1 |
|
通过git log确定要合并的commit有几次
git log
修改前四次的:
git rebase -i HEAD~4
这时的顺序是从按时间最早到最晚排列的,所以把后面几个pick都改成s然后退出保存即可。
1 |
|
跟上面的类似,但是从别的分支取出几个commit,然后在本分支上体现为一个commit:
git merge –squash long-feature-branch
git commit -m “commit from merge branch”
1 |
|
git rebase -i HEAD~3
然后把里面的几行顺序换一下就好了。
1 |
|
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
1 | >origin 是默认的远程版本库名称你可以在 `.git/config` 之中进行修改. |
以在你的工作目录中 获取(fetch) 并 合并(merge) 远端的改动。
要合并其他分支到你的当前分支(例如 master),执行:
1 | 在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现冲突(conflicts)。 这时候就需要你修改这些文件来手动合并这些冲突(conflicts)。改完之后,你需要执行如下命令以将它们标记为合并成功: |
在合并改动之前,你可以使用如下命令预览差异:
1 |
|
1b2e1d63ff
是你想要标记的提交 ID 的前 10 位字符。可以使用下列命令获取提交 ID:
1 | 你也可以使用少一点的提交 ID 前几位,只要它的指向具有唯一性。 |
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。已添加到暂存区的改动以及新文件都不会受到影响。
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
1 | git fetch origin |
##实用小贴士
内建的图形化 git:gitk
彩色的 git 输出:git config color.ui true
显示历史记录时,每个提交的信息只显示一行:git config format.pretty oneline
交互式添加文件到暂存区:git add -i
进阶教程:
http://marklodato.github.io/visual-git-guide/index-zh-cn.html
- 开分支:
branch 新分支名``` 1
2如新建一个开发分支:
``` git branch dev - 切换到某分支:
checkout 分支名``` 1
23. 合并上述两个命令:
``` git checkout -b 新分支名 - 合并分支:
merge 需要合并的分支名``` 1
25. 查看本地分支列表:
``` git branch -a - 查看远端分支列表:
branch -r``` 1
27. 向远程分支提交本地新开的分支:
```git push origin 新分支名 - 删除远程分支:(多一个空格和冒号)
push origin :远程分支名``` 1
2
3原理就是把一个空的branch赋值给已有的branch,这样就删除了。
9. 删除本地分支:
```git branch 分支名称 -d - 拉取远端:
pull origin master``` 1
211. 更新分支列表信息:
```git fetch -p - 查看帮助:
1
2
3git -h
git branch -h
git pull -h
- 其他
1
2
3
4
5git push origin :branch_you_want_to_delete
注意空格
下述命令没使用过,不知道含义 :
查看git branch -h时得知-r表示对远端生效,-d表示删除。
git branch -r -d origin/branch-name
竟然没有commit和pull.
1 | git commit fileA; |
1 | 安装brew: |
给git log 上颜色
git log --decorate --graph
git commit –amend
直接删掉changeid
会自动生成新的changeidgit add时(stage)先进行diff和修改
1
git add feature.rb -e
查看切换分支的记录log:
git reflog
结果:
894a16d HEAD@{0}: commit: commit another todo
6876e5b HEAD@{1}: checkout: moving from solve_world_hunger to kill_the_batman
324336a HEAD@{2}: commit: commit todo
6876e5b HEAD@{3}: checkout: moving from blowup_sun_for_ransom to solve_world_hunger
6876e5b HEAD@{4}: checkout: moving from kill_the_batman to blowup_sun_for_ransom
6876e5b HEAD@{5}: checkout: moving from cure_common_cold to kill_the_batman
6876e5b HEAD@{6}: commit (initial): initial commit
然后可以切换到想去的分支:git checkout solve_world_hunger
取消一个已经提交(push)的commit,原理其实是提交一次revert操作的commit.
通过git log
查看想要取消的那次commit的hash值。
1 | git revert d71adf7ad90cc0206c2076b |
删除最近一次提交:git reset --hard HEAD^
取消删除最近一次提交:git reflog
查看到倒数第二个commit的hash然后:git checkout b5ed1ea
git submodule add 仓库地址 路径