1. git init
    说明:
    把这个目录变成Git可以管理的仓库
    示例:
    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/

  2. git add
    说明:
    提交所有改动到暂存区
    参数:
    -A 提交所有

  3. git commit
    说明:
    提交所有暂存区改动至当前分支下
    参数:
    -m "提交的注释内容"
    -a add所有修改到暂存区后,再做commit操作,注意不包括新增加文件。
    --amend 重新把暂存区加到最后一次提交中,并可以修改提交内容
    示例:
    git commit -a -m "提交BUS路由寻址重构"

  4. git status
    说明:
    查看当前状态

  5. git diff
    说明:
    显示工作区与提交区的不同,两个文件的不同等。
    参数:
    git diff <某个版本号> <某个版本号> 对比两人个版本号的不同

  6. git log
    说明:
    命令显示从最近到最远的提交日志,
    e.g.
    git log --pretty=oneline -10 --before '2017-11-13'
    参数:
    --pretty=oneline 表示一行显示日志 short,full 和 fuller
    git log --pretty=format:"%h - %an, %ar : %s"(还可以自定义)选项 说明
    %H 提交对象(commit)的完整哈希字串
    %h 提交对象的简短哈希字串
    %T 树对象(tree)的完整哈希字串
    %t 树对象的简短哈希字串
    %P 父对象(parent)的完整哈希字串
    %p 父对象的简短哈希字串
    %an 作者(author)的名字
    %ae 作者的电子邮件地址
    %ad 作者修订日期(可以用 -date= 选项定制格式)
    %ar 作者修订日期,按多久以前的方式显示
    %cn 提交者(committer)的名字
    %ce 提交者的电子邮件地址
    %cd 提交日期
    %cr 提交日期,按多久以前的方式显示
    %s 提交说明
    --graph 用图型表示分支合并情况
    git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

     -(n) 仅显示最近的 n 条提交
     --since, --after 仅显示指定时间之后的提交。
     --until, --before 仅显示指定时间之前的提交。
     --author 仅显示指定作者相关的提交。
     --committer 仅显示指定提交者相关的提交。
    
  7. git reset
    说明:
    把当前版本回退,也可以把暂存区的修改回退到工作区。
    参数:
    --hard
    特别说明:

    $ git reset --hard 1094a 回退到某个版本,版本号没必要写全,前几位就可以了,Git会自动去找
    HEAD 表示当前分支下当前版本,HEAD 表示上一版本,HEAD 表示上上版本,HEAD~10 表示向上第10个版本
    $ git reset --hard HEAD
    回退到表示上一版本

    HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

    穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

    要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

    git reset HEAD readme.txt

    git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。

    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交

  8. git reflog
    说明:查看命令历史,可以查看回退后的未来版本,

  9. git checkout -- 撤消修改。
    说明:把修改撤销回到最近一次git commit或git add时的状态。注意:--表示撤销,不带--表示创建一个新分支的命令
    git checkout -- code/java/admin/src/main/resources/application.properties
    示例:
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

  10. git rm
    说明:
    从版本库中删除该文件,使用git rm删掉,再用git commit

  11. 创建ssh-key
    示例:
    $ ssh-keygen -t rsa -C "youremail@example.com"

  12. git remote
    说明:
    与远程服务器操作,无任何参数时,查看远程库列表
    参数:
    add <远程名称,如origin> ssh:git,远程地址 本地关联远程的库
    -v 显示对应的克隆地址(verbose缩写)
    show <远程名称> 查看某个远程仓库的详细信息
    rename <旧远程名称> <新远程名称> 更改远程名称
    rm <远程名称> 删除远程名称
    set-url <远程名称> <新远程地址:xxx@xxx.git>
    示例:
    git remote add origin git@server-name:path/repo-name.git

  13. git push
    说明:
    提交修改到远程服务器
    参数:
    -u 本地与服务器关联后,第一次提交,需要加上-u参数
    <远程名称> <分支名称> 按远程地址和分支名称提交
    <远程名称:origin>(空格):<远程分支:dev> 删除远程分支
    示例:
    git push -u origin master
    第一次推送master分支的所有内容,此后,使用命令git push origin master推送最新修改
    git push origin :dev 删除远程的分支
    git push -u origin dev:dev 创建一个dev分支就需要在本地先创建一个dev分支,然后推送到gogs远程仓库中。

  14. git clone
    说明:
    远程库的克隆
    git clone git@git.oschina.net:ansen/crowdfunding.git

  15. git checkout -b <新分支名称> <关联到远程分支:origin/dev>
    说明:
    创建并切换到<新分支名称>
    示例:
    git checkout -b dev
    相当于下面两条命令
    git branch dev
    git checkout dev

  16. git branch
    说明:
    列出所有分支,当前分支前会标记一个*
    参数:
    <新分支名称> 创建新分支
    -d 删除分支
    -D 强制删除分支,放弃修改 如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。
    --merge 查看哪些分支已经被合并到当前分支上了
    --no-merged 查看哪些分支还没有被合并到当前分支上了
    --set-upstream <本地分支:dev> <远程分支:origin/dev> 把本地分支关联到远程分支

  17. git checkout <分支>
    说明:
    切换分支

  18. git merge <被合并分支>
    说明:
    分支合并,把<被合并分支>合并到当前分支来,默认使用ff模式
    特别说明:
    --ff: Fast-forward合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
    这种模式下,删除分支后,会丢掉分支信息。即无法看到分支的log信息等
    (是删除后,你不知道哪个提交是来自DEV,哪个是来自MASTER的)
    --no-ff方式,是指强制禁用Fast-forward方式,这样分支信息也会被合并到当前分支。如果是常驻分支,一般是不需要--no-ff,如果是功能分支(dev这种),就需要
    示例:
    1:git merge --no-ff -m "merge with no-ff" dev
    2:git push origin master(无须再commit)

  19. 冲突解决--conflict
    说明:
    分支合并时,发生的冲突,git无法执行“快速合并”,只能试图把各自的修改合并起来。若自动合并发生了冲突,必须手动解决冲突后,再提交,再合并。

  20. git stash
    说明:
    把当前工作现场”储藏“起来。一般用于你想跳转到其他分支,但又不想提交当前分支的代码。
    参数:
    list 查看当前分支下的stash的列表
    apply 恢复
    drop 删除
    pop 恢复的同时,把stash内容也删除了
    示例:
    git stash pop
    提取最近一个stash,并清除当条stash
    git stash pop stash@{0}
    提取stash@{0},并清除

  21. git tag
    说明:
    标签操作,不带参数时,可查看当前分支的所有标签列表。标签包含两种:轻量级和附注型的。
    轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
    参数:
    对当前版本打上标签
    的历史提交操作打上标签
    -d 删除标签
    -l 'v1.4.2.*' 列出所有v1.4.2.*匹配的tag
    -a -m '附注型的说明' 打上一个附注型的标签 git tag -a v1.4 -m 'my version 1.4'

  22. git show
    说明:
    显示最新一次提交的详情
    参数:
    查看标签信息

  23. git push <远程名称>
    说明:
    把标签推送到<远程名称>
    参数:
    --tags 一次性推送全部尚未推送到远程的标签
    <远程名称> :refs/tags/ 删除一个远程标签
    -f 强行推送到远程分支
    示例:
    git push origin 1.0.0
    推送一个版本
    git push origin --tags
    推送所有未推送的标签
    git push origin :refs/tags/
    删除一个远程标签

  24. git rebase <要合并的分支: master>
    说明:
    根据当前分支(假设当前分支为dev)后续的历次提交对象,生成一系列文件补丁,然后以基底分支(也就是master)最后一个提交对象为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象,从而改写 dev 的提交历史,使它成为 master 分支的直接下游。这时,可以切换到master分支上,做一次快速合并
    参数:
    -continue 冲突处理后,运行此命令,继续完成。
    -abort 放弃 rebase过程
    -skip 直接使用dev分支来取代当前分支
    --onto 选项指定新的基底分支
    示例:
    1. 衍合也可以放到其他分支进行,并不一定非得根据分化之前的分支:
    git rebase --onto master server client
    取出 client 分支,找出 client 分支和 server 分支的共同祖先之后的变化,然后把它们在 master 上重演一遍。需要测试的是,server和client的共同祖先并不合并到基底分支上。
    2. 接下来可以再合并server和master:
    git rebase master server
    套用公式为:
    git rebase [主分支] [特性分支] 命令会先取出特性分支 server,然后在主分支 master 上重演。最终合并到master分支上。
    3. 最后再切换到master分支上,做一次快速合并
    git checkout master
    git merge client

  25. git revert
    说明:
    撤销某次操作,此次操作之前的commit都会被保留
    示例:
    假设有三个commit, git st:
    commit3: add test3.c
    commit2: add test2.c
    commit1: add test1.c
    当执行git revert HEAD~1时, commit2被撤销了
    git log可以看到:
    commit1:add test1.c
    commit3:add test3.c
    26.git pull
    多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
git branch --set-upstream-to=origin/dev dev

有时候临时在本地仓库做了修改,但是不想保留,再拉取更新的时候要强制覆盖本地文件,可以用如下命令。
git fetch --all
git reset --hard origin/master
git pull
全部使用别人的
git pull -X theirs
如果使用自己的:
git pull -X ours
批量删除 tag
=============================================== 华丽丽的分割线: Q&A =============================================
1、Q:push时遇到unpack failed: error Missing tree错误
A:因为本地索引被破坏,所以必须重建本地索引,运行如下命令:
$git gc
$git pull --rebase


1 git log filename
可以看到fileName相关的commit记录
2. git log -p filename
可以显示每次提交的diff
3. 只看某次提交中的某个文件变化,可以直接加上fileName
git show commit-id filename

4.根据commit-id查看某个提交

git show -s --pretty=raw 2be7fcb476

git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态
git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。
git reset --hard HASH #返回到某个节点,不保留修改。
git reset --soft HASH #返回到某个节点。保留修改
git fetch --all git fetch 只是下载远程的库的内容,不做任何的合并
git reset --hard origin/master git reset 把HEAD指向刚刚下载的最新的版本

终端颜色修改
试试git --no-pager log
如果可以显示的话,把pager设置为more
git config --global core.pager more

git忽略已经提交推送的文件
git rm -r --cached .#这是里删除追踪状态的文件或目录
git add .
git commit -m "fixed untracked files"

永久记录密码
git config --global credential.helper store

git push -u origin dev:dev

git导出整个项目:
git archive master | bzip2 > project.tar.bz2

git cherry-pick 4c805e2
[master 1d4b803] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
Git自动给dev分支做了一次提交,注意这次提交的commit是1d4b803,它并不同于master的4c805e2,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。

有些聪明的童鞋会想了,既然可以在master分支上修复bug后,在dev分支上可以“重放”这个修复过程,那么直接在dev分支上修复bug,然后在master分支上“重放”行不行?当然可以,不过你仍然需要git stash命令保存现场,才能从dev分支切换到master分支。


gogs 安装
下载:
cd /home/git
wget https://dl.gogs.io/0.11.86/gogs_0.11.86_linux_amd64.tar.gz
tar -zxvf gogs_0.11.86_linux_amd64.tar.gz //解压安装包
建用户:
create user 'gogs'@'localhost' identified by 'aBsd@#f@23sdc';
grant all privileges on gogs.* to 'gogs'@'localhost';
flush privileges;

使用Gogs脚本创建mysql数据库
cd /home/git/gogs/scripts/ //切换目录到gogs脚本文件夹
mysql -u root -p < mysql.sql

启动Gogs服务
./home/git/gogs/gogs web

配置Gogs服务自启动

//ctrl + c 关闭gogs服务
su root //切换到root用户
cp /home/git/gogs/scripts/init/centos/gogs /etc/init.d
//拷贝gogs脚本到init.d文件夹
chmod 774 gogs //添加执行权限
chkconfig -add gogs //添加服务的开机自启动