Git 常用命令

Git 常用命令

liuxingqi bio photo By liuxingqi Comment

git设置

//设置用户名和邮箱,每次的commit都会使用这些信息
git config --global user.name "liuzxc"
git config --global user.email lxq_102172@163.com

//当git需要你手动输入信息时,你可以设置需要打开的编辑器,默认是vim
git config --global core.editor "open -a 'Sublime Text 2'"

//检查你的设置
➜ git config --list
color.ui=true
user.name=liuzxc
user.email=lxq_102172@163.com
core.repositoryformatversion=0
core.filemode=true
remote.origin.url=.....
remote.origin.fetch=.....
github contributions graph

每个github账户都会有‘贡献图表’,如果你的commit没有出现在图表上,说明你github账户的邮箱和当前repo配置的邮箱不一致

git工作流

你的本地仓库由 git 维护的三棵“树”组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。

git 工作流

引用自git简明指南

git基础

git init        //把当前文件夹初始化为一个git repo
git clone <URL> //获取一个已经存在的git repo的拷贝
git status      //查看当前git repo的状态
git status -s   //简化输出
文件状态的生命周期
git add <file> //添加文件到暂存区
git diff: 显示您的工作目录和index之间的差异.
git diff –cached: 显示index和最近的commit之间的差异(即 git add 后的差异).
git diff HEAD: 显示您的工作目录和最新的commit之间的差异.
git commit     //提交
git commit -am "xxxxxxxxx" //跳过暂存区直接提交

在过去很长的一段时间里,我一直错误的以为 git commit -am 是 git add + git commit -m 的简写,虽然效果是一样的,但别后的实现却是不同的, git add是先把change加载到暂存区,然后通过commit提交,而git commit -am 是跳过了暂存区,直接提交。

每一次commit都会为创建一个项目的快照,方便回滚或比较。

git log 查看提交历史

git log是我使用最频繁的git命令之一,尤其是在团队协作的项目中,每天都会有大量的commit,如果你想查看自己的或同事的commit内容,git log命令可以很好的帮助你。

git log    //按时间顺序逆序列出所有的commit
git log -p //输出commit的详细信息
git log -p -n //查看最近的n条commit
git log --author=liuzxc //查看作者是'liuzxc'的提交记录
git log --since='2014-12-01' //查看2014年12月1号以来的提交记录
git log --since=2.weeks //查看最近两周的提交记录
git log --pretty=oneline //一行显示历史提交记录
git commit
//修改已经提交的注释
git commit --amend
git reset
//如果错误的把某些文件放进暂存区,可以使用以下命令取消
git reset HEAD <file>

//丢弃本地工作目录的改动,此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件
git checkout -- <file>
git remote
git remote -v //列出目前存在的远程分支
git fetch
git fetch //从远程分支获取最新版本到本地,默认是master分支

git fetch 和 git pull的区别:

  • git fetch: 从远端分支拉取但不合并
  • git pull: 从远端分支拉去并自动合并,相当于 git fetch + git merge
git merge
git branch --merged //查看哪些分支已被并入当前分支
git branch --no-merged //查看尚未合并的分支
git tag
git tag //列出当前所有的tag
git tag -a v1.2.4 -m "xxxxxx" //-a:创建tag; -m:添加注释
git push origin [tagname] //标签推送类似于分支推送
git push origin --tags //一次性推送所有本地新增标签到远端
git show <tag_name> // 现实tag的详细信息

git push并不会将tag随同数据一起push到远端服务器

Git 分支

//新建一个分支并切换到新建分支
git checkout -b new_branch
等同于
git branch new_branch
git checkout new_branch

//删除本地分支
git branch -d new_branch
//如果分支中包含未合并的工作内容,删除分支会导致数据丢失,因此-d会报错,
//如果你确实要删除分支的改动,可以使用-D强制删除
git branch -D new_branch

//删除远端分支
git push origin :<branch_name>

//查看哪些分支已被并入当前分支,如果你要清理本地无用的分支,该命令非常有用。
git branch --merge
//查看尚未合并的分支
git branch --no-merged

//清理远端已经被删除的分支
git remote prune origin or git fetch origin --prune

撤销错误的提交

在日常的工作中,有时候可能会出现这样的失误:将错误的内容提交到了远程仓库,那么应该如何取消这次错误的提交呢?

git reset --hard <commit_id> //回退到这个commit_id
git reset --hard HEAD   //取消当前的commit
git reset --hard HEAD^  //取消上一次的commit
git reset --hard HEAD~2 //取消最近两次的提交

//then:
git push origin HEAD --force //强制提交到远程仓库

撤销某次提交的其中的某个文件

如果某次commit已经push到远端仓库,但是发现某些文件不应该被提交,要如何去撤销这一个文件而不影响整个提交呢?

git log -p path/to/file #首先查找文件的提交历史
git checkout <commit> path/to/file #找到需要回退到的commit id
git commit #然后commit就可以了

如何把一个已经存在的 new project 添加到 github

  1. 在 github 创建一个新的 repo;
  2. git init (初始化 new project)
  3. git add . (添加所有的本地文件到 local repo)
  4. git commit -m "first commit" (提交文件到 local repo)
  5. git remote add origin remote_repository_url (设置remote url,告诉你本地的内容应该被 push 到哪里)
  6. git push origin master (把本地内容推送到远端)

.gitignore 文件

有些时候我们需要忽略本地仓库中的一些文件或目录,该如何去做呢?

  1. touch .gitignore #创建 .gitignore 文件
  2. 选择需要忽略的文件或目录
  • *.pyc #忽略以 .pyc 结尾的文件
  • bin/ #忽略 bin 目录

如果需要忽略的文件或目录已经被提交到远端仓库该怎么办?

从暂存区(index)中删除需要忽略的文件或目录

  • git rm --cached <file> #从暂存区中删除某一个文件
  • git rm --cached -r <directory> #删除目录需要加 -r

然后添加到 .gitignore 文件中重新 commit

git stash(储藏你的工作)

想象一下这样一种场景:你正在一个分支上工作,更改了一些代码,现在你需要切换到别的分支工作,但是当前的 代码比并不想 commit,那该怎么办呢?

git stash 可以帮助你解决这个问题,它会储存你当前的变更,然后你当前的分支就会变的干净,你可以方便的 切换到其他的分支。

  • git stash: 储藏当前的变更
  • git stash list: 查看现有的储藏
  • git stash apply: 应用你当前的储藏
comments powered by Disqus