Git使用
git常用
git help everyday, 看得懂, 并且理解他, git 基本就没有啥难事了.
初始化
- git init
- git add .
- git commit -m “first”
中间时不时的git status查看下状态.
记住密码
git config --global credential.helper osxkeychain
git config --global credential.helper store
#这个只对http模式生效.
远程
-
删除远程的库, 比如删除origin.
git remote rm origin
-
或者给现有的远程库改名.
git remote rename pb paul
-
添加远程库
git remote add origin https://github.com/lornally/search-image.git
-
push
git push -u origin master # push失败, 需要先pull. git remote add origin https://github.com/lornally/okla_android.git git pull origin master # pull也失败, 需要branch: git branch --set-upstream-to=origin/master master
-
总之都失败, 所以需要merge先:
git merge --allow-unrelated-histories git remote -v # 查看远程情况 git remote show origin
查看各种git情况: 详情在: [[git查看]]
git status
git remote
git branch
git tag
git show
git log
git分支操作
-
新建并切换到分支store
git checkout -b store # 在目前分支的基础上生成新的分支store git checkout 某个file # 不仅仅是拿分支, 也可以拿到最新版本, 也就是说放弃本地修改
-
在新的分支上, 添加并提交
git commit -a -m "add a new branch" # 这个就是添加并提交. # 之前竟然看错: [-a是说提交所有, 默认就是] # 之前竟然试用失败, 奇怪. # Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过. # 试验过, 正确的. # 明白了, modify可以正确提交, add不行. 因为新的文件还没有被跟踪.
-
如果这是一个长期分支, 那么可以主动merge master, 保持针对主线的更新.
git merge master git checkout master # 如果是临时分支, 可以回到主分支, 并将刚才的分支合并回主分支. git merge store
-
如果要删除分支store
git branch -d store # 这个分支就被干掉了, 一般长期使用的分支不需要这么干, 删除的一般都是短期的分支, 比如用来修复某个bug的分支.
远程分支
-
pull = fetch + merge
git fetch origin # 抓取源origin的master分支, 在本地成为origin/master分支, 注意这个分支不是本地的master分支, 我们可以手动合并到master分支. fetch只是把远程origin抓到本地origin/master.
-
变基有两个命令 merge & rebase
git checkout store # 切换到store分支. git merge master # 生成了一个新的版本, 合并了master到当前分支, 但是, master和store依旧是分叉的, 有分叉的过去和分叉的未来. git rebase master # 把master当做当前分支的基础, 这样master和store就没有分叉的历史了, 看上去也比较清爽, 而且也比较符合实际的业务逻辑. 这样当你推向主线的时候, 主线的管理者不需要merge了. git pull #rebase 之后需要pull. git push #rebase之后, 先pull, 再push. 然后发现整个目录清净了.
-
只要你把变基命令当作是在推送前清理提交使之整洁的工具,并且只在从未推送至共用仓库的提交上执行变基命令,你就不会有事。
-
实际操作
git remote add origin https://github.com/lornally/g_php.git # 添加一个远程的源 git checkout -b weixin # 本地建一个分支. git push origin weixin # 把这个分支推到远程. git push # 这里会失败, 因为要推送到weixin分支才行. git push --set-upstream origin weixin # 这个是本地设置, 之后就可以git push了.
-
git 得到远程的一个分支
git remote add origin https://.... # 添加一个远程的源 git pull origin weixin # 拉远程的微信分支下来. git fetch origin # 这句话是必须的, 如果不弄这个, 下面一句checkout就不能执行. git checkout -b weixin origin/weixin # 这句话建立了一个跟踪运城分支origin/weixin的本地分支weixin. # 不知道使用了这句话, 是否就可以不用上面一句了, 下次搞远程分支的时候可以使用. 明确的实验了, 不行. #403错误, 用ssh解决就行, 妈蛋的. # 关于checkout出错的解释: http://stackoverflow.com/questions/945654/git-checkout-updating-paths-is-incompatible-with-switching-branches # 关于403, 没有找到合理的办法, 网上给的办法和我同事的办法一样, git时链接里面带上用户名. # 服务器的ssh用户可以从idrsa里面看到.
git打标签
git tag -a v1.4 -m 'my version 1.4' # 正常标签
git tag v1.4-lw # 轻量标签
git log|more # 查看log, 然后补标签
git tag -a v1.2 c03837698 -m "no bug release" # c03837698是前面log展示的, commit命令的那一串校验码的.
git tag # 可以看到tag已经被打上了.
git push origin --tags # 默认是不会推tag到远程的, 因此要推tag到远程, 就需要这样显式的推.
注意, git中其实并不能真正的检出一个标签, 标签只是一个标记, 真正检出的还是commit或者branch.
git忽略
专门写了一篇blog: [[git忽略]]
git ssh
github右上角的profile setting->ssh key->add ssh key.
- 制造一个key
- 在terminal里面输入: ssh-keygen -t rsa -C “你的邮箱@qq.com”
- 然后一路回车
- 在terminal里面输入: cat ~/.ssh/id_rsa.pub
- 复制公钥可以直接用 pbcopy <~/.ssh/id_rsa.pub (感谢汤大师提供)
- 这后面的步骤, 不需要了, 然后copy terminal里面显示的一大段喵星语,类似这个样子:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA你的邮箱@qq.com
github的密码
- 如果是ssh, 参考上面一个段落.
- 网上有人说https不能缓存密码, 这个是不对的. mac和linux都支持https缓存密码, 不过工具不同.
- linux: git config –global credential.helper cache
- mac: git config –global credential.helper osxkeychain
- 参考: https://help.github.com/articles/caching-your-github-password-in-git/
参考
- https://git-scm.com/book/en/v2
- 中文版
- 用户名和密码的重复输入问题: https://help.github.com/articles/caching-your-github-password-in-git/
- 一个相当好的git简易入门: http://www.bootcss.com/p/git-guide/