GIT学习

1.初始化仓库

git init

如果遇到以下问题:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'xxx@xxx.(none)')

需要配置用户名和邮箱:

git config user.name “username”

git config user.email “email”

2.提交代码

git add .

git commit -m “”

3.查看状态

git status

4.查看修改

git diff

-change something
+change

 5.查看提交历史

git log

commit acbcfcfa48c89deb725aae9e03a68a2f5abaa1d4
Author: gcl <155@163.com>
Date:   Tue Feb 7 14:30:11 2017 +0800

    change 2

commit 99f733644454644d90b8ee39c6737dc283c78cec
Author: gcl <155@163.com>
Date:   Tue Feb 7 14:27:55 2017 +0800

    change readme.txt

commit 58110376e350d36c8df095b17ff2ecb44906eae2
Author: gcl <155@163.com>
Date:   Tue Feb 7 14:25:17 2017 +0800

    add readme.txt

简化版本信息:git log --pretty=oneline 

acbcfcfa48c89deb725aae9e03a68a2f5abaa1d4 change 2
99f733644454644d90b8ee39c6737dc283c78cec change readme.txt
58110376e350d36c8df095b17ff2ecb44906eae2 add readme.txt

6.回退版本

HEAD指向当前版本,HEAD^是上一版本,HEAD^^是上上版本,HEAD~100是上100个版本

回到上一版本:git reset --hard HEAD^  

回到某一历史:git reset --hard commitid

7.查看命令历史

git reflog

acbcfcf HEAD@{0}: reset: moving to acbcfcfa4
99f7336 HEAD@{1}: reset: moving to HEAD^
acbcfcf HEAD@{2}: commit: change 2
99f7336 HEAD@{3}: commit: change readme.txt
5811037 HEAD@{4}: commit (initial): add readme.txt

8.工作区与暂存区

respository文件夹:工作区

.git:版本库,包含了stage(暂存区),分支master,指针HEAD

git add是把文件修改放到了暂存区,git commit把暂存区的内容提交到了分支,没有提交到暂存区的修改是不会被提交到分支的

提交的事件线:工作区->git add->暂存区->git commit->分支

9.撤销修改

(1)撤销add前在工作区的修改:git checkout -- readme.txt

(2)撤销add后,commit前在暂存区的修改:git reset HEAD readme.txt

reset可以回退版本,还可以撤销add到暂存区的内容,重新回到工作区,可以再次checkout -- 来撤销在工作区的修改

(3)撤销commit之后,push之前:git reset

10.删除文件

git rm

git commit

撤销删除,找回文件:git checkout -- filename

git checkout:使用版本库中的最新版本替换工作区的版本,即撤销git add/rm之前的修改

11.github使用

1)在http://git.oschina.net创建库:

  (1)ssh-keygen -t rsa -C "xxxxx@xxxxx.com"# Creates a new ssh key using the provided email

  # Generating public/private rsa key pair...

  (2)cat ~/.ssh/id_rsa.pub

  # ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc.... 将public key添加

  (3)ssh -T git@github.com (github)

  ssh -T git@git.oschina.net (oschina)

  Welcome to Git@OSC, yourname! 

2)为github上的开源仓库贡献代码:

  (1)fork:在GitHub上,可以任意Fork开源仓库

  (2)提交修改到自己帐号上的仓库:自己拥有Fork后的仓库的读写权限

  (3)pull request:可以推送pull request给官方仓库来贡献代码

12.远程仓库

(1)本地库origin与远程库learngit关联,origin为git的默认叫法

git remote add origin git@github.com:XXX/learngit.git(XXX为你的github账户名)

(2)将本地库中的所有内容推送到远程库中,加上-u将本地master分支和远程master分支关联起来,以后推送就可以直接使用git push简化命令

git push -u origin master

(3)以后推送使用以下命令

git push origin master

 (4)把远程库克隆到本地,使用https速度慢,而且每次都要输入口令

git clone ssh或https

(5)push与pull

push:本地 --> 远程,如果本地超前远程,需要push

pull:本地 <-- 远程,如果本地落后远程,需要要pull 

13.分支

(1)创建分支:将当前分支中的所有文件拷贝到新分支

git branch second

切换到分支

 git checkout second

创建+切换到分支:-b

git checkout -b second

(2)查看当前分支

git branch

(3)合并指定分支到当前分支

git merge second

撤销合并操作:

git reset

(4)删除分支

git branch -d second

git branch -D second:强行删除一个没有合并过的分支

git push origin --delete second 删除远程分支

(5)合并分支默认使用”fast forward”模式,合并后看不出做过合并,禁用”fast forward” 使用普通模式,合并后的历史可以看出曾经做过合并。禁用”fast forward”并且加上了commit描述:

git merge --no-ff -m "merge with no-ff" second

(6)分支管理策略

(7)本地分支:master,dev,bug,feature(最好在开发新功能时为每一个新功能创建一个分支)

远程分支:origin,dev

 14.解决冲突

(1)查看冲突

git status

(2)查看分支合并图 git log --graph

git log --graph --pretty=oneline --abbrev-commit

 (3)合并分支发生冲突后,解决冲突步骤:查看冲突->修改->提交->合并完成

 15.bug分支:将当前无法提交到现场先保存起来,使工作区回复clean状态,修复bug后,再将保存的东西解开

(1)将工作现场先保存起来:git stash

(2)查看保存现场记录:git stash list

(3)恢复工作线程

git stash apply :stash内容不删除,需要使用 git stash drop手动删除

git stash pop:恢复的同时将stash的内容删除

git stash apply stash@{0}:有多个stah时,指定恢复到某个stash

16.多人协作

(1)查看远程分支

git remote

查看远程分支详细信息

git remote -v

(2)推送分支:将本地某个分支中的所有提交推送到远程库

git push origin master

(3)从远程抓取新提交

git pull

注意:如果git pull时提示“no tracking information”,则需要指定本地master/dev分支与远程origin/dev分支的链接后,才能pull

git branch --set-upstream dev origin/dev  已弃用,更新为:  git branch --set-upstream-to=origin/dev dev

(4)多⼈人协作的⼯工作模式通常是这样:

  1. 首先,可以试图⽤git push origin branch-name推送⾃自⼰己的修改;
  2. 如果推送失败,则因为远程分⽀支⽐比你的本地更新,需要先⽤用git pull试图合并; 
  3. 如果合并有冲突,则解决冲突,并在本地提交; 
  4. 没有冲突或者解决掉冲突后,再⽤用git push origin branch-name推送就能成功! 

17. 标签

(1)添加标签:切换到指定分支后,git tag v1.0

(2)查看所有标签:git log --pretty=oneline --abbrev-commit

(3)补加标签:找到commitid后添加标签,git tag v0.9 commitid

注意,标签不是按时间顺序列出,而是按字母排序的。

(4)查看某一标签信息:git show v0.9

(5)添加标签时添加说明,用-a指定标签名,-m指定说明文字:

git tag -a v0.1 -m "version 0.1 released" 3628164
(6)用私钥签名一个标签:
git tag -s v0.2 -m "signed version 0.2 released" fec145a

(7)删除标签

git tag -d v1.0

(8)将本地某一标签推送到远程:

git push origin v1.0

推送本地所有未推送到远程的标签:

git push origin --tags

(9)删除远程标签:需要先删除本地标签

git tag -d v1.0

git push origin :refs/tags/v1.0

 18.自定义git

(1)配置用户名和email

git config --global user.name "Your Name"

git config --global user.email "email@example.com"

(2)给git命令添加颜色

git config --global color.ui true

(3)忽略特殊文件:添加.gitignore

强制添加被忽略的文件:git add -f App.class
查看想添加的文件被.gitignore中的哪条规则忽略了:git check-ignore -v App.class
(4)配置别名

git config --global alias.st status

git config --global alias.co checkout

git config --global alias.ci commit

git config --global alias.br branch

git config --global alias.unstage 'reset HEAD'

git config --global alias.last 'log -1' 

git config --global alias.lg "log --color --graph --

 注意:--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用

(5)配置文件

每个仓库的Git配置文件都放在.git/config文件中,查看配置文件:cat .git/config

要删除别名,直接把对应的行删掉即可

改错了,可以删掉文件重新通过命令配置

19.自己搭建git服务器

(1)安装git

sudo apt-get install git

(2)创建一个git用户,用来运行git服务

sudo adduser git

(3)创建证书登录

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个

(4)初始化Git仓库

sudo chown -R git:git sample.git

(5)禁用shell登录

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

 git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

(6)克隆远程仓库

git clone git@server:/srv/sample.git

(7)要方便管理公钥,用Gitosis

  要像SVN那样变态地控制权限,用Gitolite

Git的官方网站:http://git-scm.com

附Unix命令:

(1)创建文件夹:mkdir

(2)跳到指定路径:cd

(3)查看当前完整路径:pwd

(4)查看当前路径下的所有文件及文件夹:ls

(5)cat:可以显示文件内容,但是不能编辑

(6)touch:如果文件存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间; 
如果文件不存在,touch指令会在当前目录下新建一个空白文件

(7)vi/vim:打开文件后可以编辑

(8)echo:输出

本文为阅读廖雪峰的官方网站中的git教程的学习笔记,仅为自己的一点学习记录,原文写的非常好,作者很厉害,有兴趣的朋友可以阅读原文:廖雪峰的官方网站的git教程

原文地址:https://www.cnblogs.com/guchunli/p/6203031.html