[TOC]linux
git config --global user.name "" git config --global user.email ""
git init
git add filename
git commit -m "statement about the change"
git status
,检查仓库各分支状态git add
保存修改,使用git checkout
放弃修改。git add
暂存更改后,可使用git reset
取消暂存。若是有多个文件,而且不一样文件间有的是为了同一个功能,有的不是,最好的是将他们分别暂存提交,能更容易的调优每一次提交。git
git config --global core.editor vim
使用
git .
来添加当前文件夹中全部子文件夹和文件。shell
git log
:一条提交记录分多行展现:第一行是提交的惟一hash值;第二行是做者,第三行是提交时间,而后是提交的说明vim
- 使用
git log --pretty=oneline
使得每条记录做为一行输出- 使用参数
--max-count=2
表示从记录中选择最新的两条记录输出- 参数
--since="5 minutes ago"
5分钟前到如今的提交记录- 参数
--until="5 minutes ago"
输出从仓库创建到5分钟前提交的记录- 参数
--author="username"
输出username用户提交的记录- 参数
--merge
输出只有merge的提交记录- 使用
man git-log
查看log相关的参数- 使用
--graph
使用ascll图形布局显示提交树- 使用
--date=short
保留日期格式更好且更短
git log的pretty 的format参数值可使用安全
- %h:commit的hash时间
- %cd:create datetime建立时间
- %s:statement注释
- %an: author name
在当前用户home目录$HOME
(linux使用命令 cd ~
进入)中,有git的配置文件.gitconfig
输入配置以下:服务器
[alias] co = checkout ci = commit st = status br = branch hist = log --pretty=formate:'%h %ad | %s%d [%an]' --graph --date=short type=cat-file -t dump = cat-file -p
设置shell别名:编辑器
alias gs='git status ' alias ga='git add ' alias gb='git branch ' alias gc='git commit' alias gd='git diff' alias gco='git checkout ' alias gk='gitk --all&' alias gx='gitx --all' alias got='git ' alias get='git '
若是须要使用go语言,须要将上述alias中
go
改成gco
比较好。gs
可能与linux ghostscript冲突。须要注意!布局
使用git tag v1
(其中v1表示版本号)给当前版本打上标签fetch
使用git checkout
转到其余版本,而后使用git tab versionnumber
给转到的版本打上标签。指针
使用
git checkout v1^
表示v1上一个版本。或者使用git checkout v1~1
。
使用git checkout master
跳转到master上面(否则以后操做的时候就把当前master的记录给覆盖掉了)
git add
暂存到仓库,那么可使用git checkout filename
将文件转到以前的master版本保存的记录。git reset HEAD filename
去取消暂存,可是reset命令不会更改文件内容, 文件中已经修改的内容还在文件中。若是想将文件中的内容恢复到原来状态,可使用git checkout filename
git revert HEAD
(会自动打开commit编辑界面)或者git revert --no-edit
(不会打开编辑器),将提交版本回到上一个版本。也能够就爱那个HEAD
部分使用更早版本的hash值代替,直接回到更早的版本。revert
命令是撤销仓库中任意提交的命令。 reset
命令是重置命令,当给定 一个提交的 引用(标签,hash值, 分支)时, reset命令将:可使用git reset --hard v1
将分支中中v1版本之后的提交所有移除。 其中--hard
参数表示应当更新工做目录(文件和文件夹)以便与新的分支头保持一致。
使用git hist --all
能够看到以前的全部提交记录,什么文件都没有丢。被移除的内容会一直保存在仓库中,知道运行垃圾回收软件。
重置通常是安全的,可是若是分支是共享在远程服务器上的,那么reset可能会致使用户共享的分支混乱
在上例中,能够经过git tag -d tagname
移除标签,让仓库回收删除的分支(回收垃圾)。 回收后使用git hist --all
,在分支的历史记录中就看不到移除的分支信息了,好像那个分支从未提交同样。
在提交了一个版本后,发现提交的版本忘了一项纪录,可是又不想提交两次,则能够在修改/添加好要修改的记录后,使用git add filename
将添加/修改的file暂存,而后使用git commit --amend -m "comment"
命令,替换掉上次的提交记录。
在项目须要调整文件结构的时候,须要移动文件。 使用git mv
命令移动文件。
使用ls .git
查看.git
目录下文件
$ ls .git COMMIT_EDITMSG ORIG_HEAD hooks logs rr-cache HEAD config index objects MERGE_RR description info ref
对象存储在objects文件夹中,文件爱你都通过压缩处理。
$ ls -C .git/objects 09 1f 27 43 69 83 97 af e4 info 0f 22 28 58 6b 94 9c b5 e7 pack 11 24 32 59 78 96 a1 c4 eb
$ ls -C .git/objects/09 6b74c56bfc6b40e754fc0725b8c70b2038b91e 9fb6f9d3a104feb32fcac22354c4d0e8a182c1
在objects目录的子目录中,每一个文件都是用38字符命名的文件。
配置在.git/config
文件中,该文件是项目级配置文件。在这儿的配置条目将覆盖你的主目录中.gitconfig
文件中的配置条目。
$ cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true
$ ls .git/refs heads tags $ ls .git/refs/heads master $ ls .git/refs/tags v1 v1-beta $ cat .git/refs/tags/v1 1f7ec5eaa8f37c2770dae3b984c55a1531fcc9e7
.git/refs/heads
文件夹保存全部的分支,文件名为分支名。文件中的内容为该分支最后一次提交的hash值。 .git/refs/tags
文件夹保存标签。每一个标签文件中是标签对应的提交版本hash值。
$ cat .git/HEAD ref: refs/heads/master
HEAD文件保存当前分支的引用。
使用git checkout -b branchname
建立并切换到分支。 它是git branch branchname
和git checkout branckname
的简写。
使用git checkout branchname
切换分支,在不一样分支下,相同文件的内容可能会不同。
当出现多个分支,master开始修改文件,那么在git log --graph --all
就可看到版本分叉。 此时可能须要将多个分支合并 使用git merge branchname
将当前分支与branchname分支合并到当前分支。
将master分支修改后,bak分支不变,merge master分支到bak 可保持bak与master的兼容性。
冲突缘由:greeter有一个文件的版本,master有一个版本,合并的时候怎么选择?
使用编辑器打开冲突文件,手动解决冲突。
解决冲突后,将greeter merge到master,执行的是快速合并,由于master头是分支greeter头的祖先,能够进行快速合并,当快速合并时,分支指针简单的前进到与greeter分支相同的提交处。
git rebase master
将master分支的全部的更改和greeter分支更改合并到greeter分支。而且提交树会被重写,以致于master分支称为greeter分支的一部分。通常在公有仓库使用合并,在短时间本地项目中使用变基。 变基会丢失历史提交信息!!! 变基会形成老版本丢失(垃圾回收时)
使用git clone from to
可将from仓库克隆到to仓库。这两个仓库几乎同样,除了to仓库多了一个origin
分支。
使用git remote
查看远程仓库的列表 使用git remote show origin
便可查看origin
的信息。
使用git branch
发现只有master分支列出来了。【git branch
默认只会列出本地分支】
使用git branch --all
列出所有分支,此时能够看到从远程仓库中克隆的分支。
使用git fetch
从远程仓库拉下更改,拉下的更改是合并到了origin/master
分支【即origin仓库的master分支】,可是它并无将拉下的更改整合到克隆仓库的分支中。
git fetch
从远程仓库中取得新的提交,可是它不会将这些提交合并到本地仓库中。
使用git merge origin/master
合并origin/master分支到本地分支。
上述的拉下并合并能够由操做
git pull
完成,git pull
等价于git fetch
和git merge
添加远程分支到本地分支。git brach --track greeter origin/greeter
操做后,在克隆仓库中就能够看到远程仓库的greeter分支了。
使用git push origin master
,将本地仓库推送到远程仓库的master分支。
此时若是在远程仓库包含工做目录,并且使用
git checkout master
正在master分支中。会报错“git 不容许push 操做更新到non-bare 仓库,由于这样会致使remote仓库的索引(index)和工做树(work tree) 与你push的不一致”。 ** 解决的办法**:最好是将更改push到裸仓库;也可将远程仓库checkout到别的分之下。这样就能够push到远程仓库的master分支了。
裸仓库指的是没有工做目录(工做目录指须要作版本管理的文件目录)的仓库,即只有原仓库中的.git
目录下的文件。
裸仓库通常用于共享。方便合做开发。 好比多人开发: A:裸仓库 B:仓库1 C:仓库2 B修改后,push到A,C获取更改只须要从A中获取更改,并与本身的分支合并。
使用git clone --bare hello hello.git
建立裸仓库hello.git
。
使用git daemon --verbose --export-all --base-path=.
使用git共享本身的仓库。
若是想使用远程push,托管的仓库必须设置参数
--enable=receive-pack