git常用

git help everyday, 看得懂, 并且理解他, git 基本就没有啥难事了.

初始化

  1. git init
  2. git add .
  3. git commit -m “first”

中间时不时的git status查看下状态.

记住密码

git config --global credential.helper osxkeychain 
git config --global credential.helper store
#这个只对http模式生效. 

远程

  1. 删除远程的库, 比如删除origin.

     git remote rm origin
    
  2. 或者给现有的远程库改名.

     git remote rename pb paul
    
  3. 添加远程库

     git remote add origin https://github.com/lornally/search-image.git
    
  4. 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   
    
  5. 总之都失败, 所以需要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分支操作

  1. 新建并切换到分支store

    git checkout -b store     # 在目前分支的基础上生成新的分支store
    git checkout 某个file  # 不仅仅是拿分支, 也可以拿到最新版本, 也就是说放弃本地修改
    
  2. 在新的分支上, 添加并提交

    git commit -a -m "add a new branch" # 这个就是添加并提交. 
    	# 之前竟然看错: [-a是说提交所有, 默认就是]
    	# 之前竟然试用失败, 奇怪.
    # Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过.
    # 试验过, 正确的.
    # 明白了, modify可以正确提交, add不行. 因为新的文件还没有被跟踪.
    
  3. 如果这是一个长期分支, 那么可以主动merge master, 保持针对主线的更新.

    git merge master
    git checkout master  # 如果是临时分支, 可以回到主分支, 并将刚才的分支合并回主分支.
    git merge store
    
  4. 如果要删除分支store

    git branch -d store  # 这个分支就被干掉了, 一般长期使用的分支不需要这么干, 删除的一般都是短期的分支, 比如用来修复某个bug的分支.
    

远程分支

  1. pull = fetch + merge

    git fetch origin  # 抓取源origin的master分支, 在本地成为origin/master分支, 注意这个分支不是本地的master分支, 我们可以手动合并到master分支. fetch只是把远程origin抓到本地origin/master.
    
  2. 变基有两个命令 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. 然后发现整个目录清净了.
    
  3. 只要你把变基命令当作是在推送前清理提交使之整洁的工具,并且只在从未推送至共用仓库的提交上执行变基命令,你就不会有事。

  4. 实际操作

    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了.
    
  5. 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.

  1. 制造一个key
    • 在terminal里面输入: ssh-keygen -t rsa -C “你的邮箱@qq.com”
    • 然后一路回车
    • 在terminal里面输入: cat ~/.ssh/id_rsa.pub
  2. 复制公钥可以直接用 pbcopy <~/.ssh/id_rsa.pub (感谢汤大师提供)
  3. 这后面的步骤, 不需要了, 然后copy terminal里面显示的一大段喵星语,类似这个样子:
    • ssh-rsa AAAAB3NzaC1yc2EAAAADAQABA你的邮箱@qq.com

github的密码

  1. 如果是ssh, 参考上面一个段落.
  2. 网上有人说https不能缓存密码, 这个是不对的. mac和linux都支持https缓存密码, 不过工具不同.
  3. linux: git config –global credential.helper cache
  4. mac: git config –global credential.helper osxkeychain
  5. 参考: 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/