您的位置:首页 > 其它

GIT学习笔记

2016-11-18 14:26 302 查看
官网:
https://git-scm.com/

GIT和SVN相同的地方:

跟踪所有文件的改动历史

只能跟踪文本文件的改动详情,无法跟踪二进制文件(比如word、PPT、Excel、图片)的改动详情
GIT和SVN的区别:

所有机器上的版本库都是平等的,没有主次之分

两个用户可以互相合并对方的代码,不用通过中央库(不过一般都会使用中央库)

GIT使用SHA1作为版本号,SVN使用递增的整数作为版本号

GIT有暂存区,SVN则是直接提交

GIT切换分支很方便,SVN比较麻烦

操作流程:
工作区、版本库,add、commit。其中,stage(应该是“筹划”提交的意思)为暂存区或叫index:



注:每次修改完之后,都要add到stage之后,才可以被commit进分支库中。
如果对同一个文件做了一次修改之后,add,然后再修改一次,这时候commit只会提交第一次修改。第二次修改还得add之后再commit才会被提交。

安装:(略)
Linux:检查git是否已经安装:git
Windows:

命令行工具:https://git-for-windows.github.io/

基于上面这个命令行工具的乌龟(类似于SVN的那个工具):https://tortoisegit.org/

或:图形化管理工具:SourceTree(需要注册,比较麻烦)

Repository(版本库、仓库):
操作系统中的一个目录,这个目录里面的所有文件都可以被git管理起来,每个文件的修改、删除都能被git跟踪和还原。
创建仓库:
mkdir my-repo
cd my-repo
git init
检查是否有一个.git目录(注:手动改动这目录会破坏git 仓库)。

提交文件:
添加文件到仓库(文件名可以用“.”代替,表示当前目录下的所有文件):
git add <file1_name> <file2_name> ...
提交文件到仓库:
git commit -m "<comments>"
查看仓库的当前状态(是否有等待提交的文件等):
git status
查看文件修改的具体内容:
git diff <file_name>
git diff HEAD
查看提交的历史记录:
git log 或:git log --pretty=oneline
查看所有操作的历史记录:
git reflog(可以查询到每次操作对应的版本号)

提交到远程仓库:
git push origin master

删除文件:
rm <file_name>
git rm <file_name>
git commit -m "delete file"

撤销修改:
1、如果在本地工作区对某个文件进行修改或删除后,想撤销:
git checkout -- <file_name> (让这个文件回到最近一次commit或add时的状态。相当于svn的“还原”功能。)

如果修改过的文件还没被add/rm到暂存区,则还原到和版本库一样(checkout版本库中的文件覆盖掉本地文件)

如果修改过的文件已经被add到暂存区,则还原到暂存区一样(checkout缓存区中的文件覆盖掉本地文件)

2、如果想撤销已经add到暂存区的修改(需要执行两步):
git reset HEAD <file_name>
(撤销暂存区中的修改)
git checkout -- <file_name>
(撤销工作区中的修改)

3、如果想撤销已经commit,但还没有push到远程库的修改:
需要用到“版本回退”

版本回退(相当于把HEAD指针指向另外一个位置):
回退到上个版本:
git reset --hard HEAD^
回退到指定版本号:
git reset --hard 3628164(版本号的前若干位)

参数的区别:

soft:HEAD updated

mixed:HEAD and index updated

hard:HEAD, index, and working tree updated

Git分支操作:
作用:
可以在服务器创建一个自己的开发分支(跟SVN不同的是,创建分支和切换很快很方便),自己每天的代码提交到这里,等测试完之后再合并到主分支上。

创建并切换到分支"dev":
git checkout -b 'dev'
此命令相当于这两条:
git branch dev
(创建dev分支)
git checkout dev (切换到dev分支,此时HEAD改为指向dev分支)
相当于在Eclipse上的这个操作:Team -> Switch To -> New Branch...

push本地分支到远程:
git push origin dev

查看当前分支:
git branch
切换回master分支:
git checkout master

合并dev分支上的修改到当前分支上:
git merge dev

如果没有冲突,就是fast-forward是合并,立刻完成。不过这种情况会让原来的dev分支从历史中抹掉。。。
如果不想这种情况发生,可以加个“--no-ff”参数:
git merge
--no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

如果有冲突,合并的命令会失败。这时候编辑冲突的文件,把分支上的修改弄进去,再提交、合并,就可以成功了。

查看分支合并后的情况:
git log --graph --pretty=oneline --abbrev-commit

删除dev分支:
git branch -d dev
如果该分支还没被merge,尝试删除会有错误提示,需要用-D参数强行删除:
git branch -D dev (不过,劳动成果一般不应该删除,留着也不碍事)

分支开发:
一般是每个人在自己的分支上开发,测试完后在合并到主分支上,主分支用于发布。如下图所示:



代码临时藏匿区stash:
如果有些代码写到一半的时候,临时有紧急任务需要切换到另外一个分支上开发(比如紧急bug修复),这时候可以把尚未写完不想提交的代码临时存到stash区中去,这样就可以腾出工作区来搞临时任务。

把工作区中未提交的代码保存到stash中:
git stash
git stash -u (-u表示unchecked,包括新文件。千万不能用-a,不然.gitignore中的文件也会被弄进去)
查看工作区是不是已经清空:
git status
如果已经清空,就可以checkout另外一个分支来干活了。
查看stash中是否有东西:
git stash list
把stash中的内容恢复到工作区中,同时清除stash中的内容:
git stash pop
这也等价于下面两条命令:
git stash apply
(恢复内容到过去)
git stash drop
(清空stash)

可以stash多次,这时候如果要恢复,就需要制定想恢复哪一个:
先用git stash list看有哪几次stash;
然后:
git stash pop stash@{id}
git stash pop 等价于
git stash pop stash@{0}

查看某次stash中的详情:
git stash show stash@{id}

和远程仓库之间的操作
查看远程仓库简要信息:
git remote
查看远程仓库详细信息:
git remote -v
把本地仓库提交到远程仓库:
git push origin master
git push origin dev

第一次克隆仓库到本地的时候,只会看到master分支。
如果需要添加其他分支到本地,需要另外执行(比如dev分支):
git checkout -b dev origin/dev
该操作checkout dev分支,并切换过去。这样就可以对dev这个分支进行修改,再push到远程了。

如果提交的时候提示冲突,则应该先把远端的代码pull下来,解决冲突之后,再push
git pull
如果此时提示“no tracking information for the current branch”,则需要关联以下本地和远程分支,然后再pull:
git branch --set-upstream dev origin/dev

删除远程分支:
git push origin --delete <branch_name>

标签管理:
一般发布一个版本之后,会在发布的那个commit上打一个标签,以方便以后万一需要回滚的时候根据标签号找到这个版本。
查看所有的标签(按字母排序):
git tag
查看标签详情:
git show v1.0

在当前的commit上打一个新的标签:
git tag v1.0
对某个commit id打标签:
git log --pretty=oneline --abbrev-commit
git tag v0.9 <commit id>
打一个带说明文字的标签:
git tag -a v1.0 -m "version 1.0 released" <commit id>

删除标签(本地):
git tag -d v0.9
删除远程标签:先本地删除(上面那步),然后:
git push origin :refs/tags/v0.9

推送标签到远端:
git push origin v1.0
(推送某个指定的标签)
git push origin --tags (推送所有的标签)

Eclipse 和 Git:
Eclipse中的免SSH登录设置
Window -> Preferences -> General -> Network Connections -> SSH2

如果之前已经生成公钥和私钥:“General”标签中,“Add Private Key...”选中那个私钥文件加入;然后把“.pub”文件中的内容追加到Git服务器的git用户home目录下(比如/home/git/.ssh)的authorized_keys文件中(也可以在“Key Management”中选择“Load Existing Key...,然后“Export Via SFTP...”到git服务器);

如果之前没生成公钥和私钥:选择“Key Management”标签,点击“Generate DSA Key...”或“Generate RSA Key...”,在Comment中输入一个识别标志;然后“Save Private Key...”,然后“Export Via SFTP...”到git服务器(根据提示输入 “<user>@<host>:<ssh port>”)。

Eclipse 中 checkout GIT项目:
import -> Projects from Git -> Clone URI

假设项目名为“registry”、ssh用户名为git:

URI: ssh://git@<host>:<ssh port>/opt/git/registry

然后输入密码
Import as general project

项目 -> 右键 -> Configure -> Convert to Maven Project...

提交新项目到GIT:
1、ssh到Git所在的LINUX,先创建仓库:
su git
cd /opt/git
mkdir <project_name>
cd <project_name>
git --bare init

2、Eclipse,提交项目到服务器的仓库中:
项目 -> 右键 -> Team -> Share Project... -> GIT
勾选“Use or create repository in parent folder of project"
点击框里面的项目,点击“Create Repository”-> Next

Eclipse中设置提交时使用的邮箱和用户名:
Window -> Preferences -> Team -> Git -> Configuration
选择“User Settings”-> Add Entry...
添加:user.email, user.name

如果需要为某个项目特别指定:选择“Repository Settings”,在Repository下拉菜单中,选择一个项目,添加:user.email, user.name。

这个操作相当于以下命令:
git config user.name "myName"
git config user.email "myName@mail.com"

相关名词(按字母排序):

fast-forward:快速合并,当merge一个分支的时候,如果两个分支没有冲突(CONFLICT
),就执行fast-forward merge

HEAD:指向当前的工作中的分支,或其中的commit。“HEAD^”表示上一个版本,“HEAD^^”表示上上一个版本,“HEAD~100”表示上100个版本

master:我们创建版本库时,git为我们自动创建的第一个分支(一开始HEAD指向master)

origin:代表被clone的远端仓库,比如“origin/master”代表远端的master分支。想向/从这个远端仓库push/pull 的时候,用 origin 指代这个远端仓库:git pull origin

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

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

stage:筹划提交的暂存区

stash:工作区代码的临时藏匿区,用于临时保存工作现场,以便腾出工作区来修改其他代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  git 笔记