Git使用笔记

linux安装Git

1.使用yum形式安装,会直接把依赖的包都装上

# yum install git

2.使用源码形式安装

官网地址 http://git-scm.com/

源码下载地址:https://git-core.googlecode.com/files/git-1.9.0.tar.gz

源码形式需要调用 curl, zlib, openssl, expat, libiconv等库代码,所以需要先安装这些依赖工具。

# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

安装文件下载到指定文件夹后使用如下命令安装

# tar -xvzf git-1.9.0.tar.gz 

# cd git-1.9.0

# ./configure --prefix=/usr/local 

# make

# make install

安装后看看版本

# git --version

git version 1.9.0

初次使用需要配置用户信息,配置个人信息可以针对三种情况,1:针对系统,2:针对当前登录用户,3:针对单个项目。

当前登录用户配置如下:

$ git config --global user.name "youname"

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

如果要针对系统则使用 --system, 针对项目则去掉--global选择就可以了

$ git config -l  # 查看用户配置

服务器上创建纯仓库,--shared选项是设置该仓库加入到可写的组

# git init firstproject.git --bare --shared

进入指定目录后,clone远程仓库代码

$ git clone ssh://root@192.168.0.126:6022/data/git/firstproject.git

$ git clone ssh://root@192.168.0.126:6022/data/git/firstproject.git newproject  # 自定义项目名称

$ git clone --bare ssh://root@192.168.0.106:6022/data/git/teacherapi.git # 克隆纯仓库

进入到本地项目目录后,右键菜单打开git bash

$ git init # 初始化git项目

$ git add .  # 添加到暂存(staged)区域,只处理添加和修改,不处理删除

$ git add -A 处理所有:添加、修改、删除

$ git add -u 处理修改和删除,不处理新添加文件

$ git reset HEAD filename # 取消已暂存的文件

$ git reset --hard "log_hash" # 强制重置到指定版本,之后提交的文件都会被删除,并且相关提交日志也会跟着删除

$ git reset "log_hash" # 重置到指定版本,之后提交的日志都会被删除,但是之后提交的文件会恢复到未跟踪状态

$ git reset HEAD^  # 取消最后一次提交,与git reset "log_hash"效果一样

$ git revert "log_hash" # 撤销某次操作, 那次添加的文件会被删除,但提交日志不会删除,同时会增加撤销操作执行的日志

$ git reflog # 查看所有HEAD的历史,reset操作日志会记录到这里,再次使用git reset "reflog_hash"可以恢复已删除的记录

如果因为reset等操作丢失一个提交的时候,总是可以把它找回来。除非你的操作已经被git当做垃圾处理掉了,一般是30天以后。

$ git commit -m "initial project version" # 提交到本地仓库

$ git commit -a -m "commit project" # 不通过暂存区域直接提交已跟踪的文件

$ git commit --amend # 修改最后一次提交message内容

$ git checkout -- filename # 取消对文件的修改, 取消后在使用git status 查看状态应该是未修改状态

# 忽略已跟踪的文件

$ git rm --cached logs/xx.log (--cached参数表示删除仓库文件同时保留本地文件) 然后更新 .gitignore 忽略掉目标文件,在然后 git commit -m "We really don't want Git to track this anymore!" 最后推送到远程仓库 git push origin master:master

有的时候工程里面会有很多没有追踪的文件和目录,一个一个地删除太麻烦。 git clean可以帮你批量删除,非常的方便。下面介绍一下git clean的使用:

$ git clean -n 显示要删除的文件

$ git clean -dn 显示要删除的文件和目录

$ git clean -di 进入交互模式

$ git clean -f 删除未追踪的文件

$ git clean -dff 删除未追踪的目录

$ git clean -df 删除未追踪的文件和目录(不包含ignored中文件)

$ git clean -dxf  # 清除所有未跟踪文件,包括纳入ignored的文件

远程仓库使用

$ git remote add origin ssh://root@192.168.0.125:6022/var/git/firstproject.git # 添加远程仓库

$ git remote rm repository_name # 删除远程仓库

$ git remote rename old_name new_name  # 修改远程仓库名称

$ git remote -v # 查看远程仓库信息

$ git remote show origin # 查看指定远程仓库信息

$ git push origin master:master or  git push origin master  # 推送到远程分支 语法:git push[远程名] [本地分支]:[远程分支], 克隆操作会自动使用默认的  master 和 origin 名字

$ git fetch origin master # 从远程仓库抓取数据, 语法:git fetch [remote-name], 注:fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支

$ git pull origin master # 自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支,如果发生冲突可以使git rebase --abort 终止合并

$ git fetch origin  # 将远程分支信息获取到本地,某些时候本地想创建分支的时候直接跟踪远程分支,但本地并无远端分支信息,就可以用该命令先获取在跟踪

$ git mv readme.txt readme # 修改文件名,需要执行commit和push命令才能更新到版本库

$ git rm *.bak # 删除文件,需要执行commit和push命令才能更新到版本库

$ git rm --cached log/*.log # 删除仓库文件的同时,保留本地文件

# 忽略文件,使用vi命令创建一个.gitignore的文件

# 在pull过程中遇到冲突问题,编辑冲突文件后,使用git add命令重新添加到缓存区后,就可以正常执行git commit命令

分支使用

$ git branch hotfix # 创建分支

$ git checkout hotfix # 切换分支,切换过程中尽量避免存在缓存区文件

$ git checkout -f develop  # 强制切换分支

$ git checkout -b branch_name # 创建新分支并切换到新分支

$ git checkout -b local-branchname origin/remote_branchname  # 获取远程分支的同时创建本地分支

$ git merge develop  # 这个命令把分支"develop"合并到了当前分支(master)里面, 注意合并前先checkout到master分支

$ git branch -d hotfix # 删除分支

$ git branch -D hotfix # 强制删除为未并的分支

$ git branch # 查看当前分支

$ git branch -a # 查看所有分支

$ git branch -r # 查看远程分支

$ git branch -v # 查看个分支最后一次提交信息

$ git branch --no-merged # 查看未合并的分支

$ git push origin hotfix:serverfix # 本地分支hotfix推送到远程分支serverfix,如果远程分支不存在则创建

$ git checkout -b serverfix origin/serverfix # 获取到本地一份新的远程分支

$ git checkout --track origin/serverfix # 跟踪分支, 与该语句“git checkout -b serverfix origin/serverfix”效果一样

$ git push origin :serverfix # 删除远程分支

$ git push origin --delete develo  # 删除远程分支

$ git branch -r -d origin/develo   # 删除本地跟踪记录

$ git remote prune origin   # 清除远程不存在的分支

$ git remote show origin  # 查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

如果当前分支已经修改了,这时候正常切换是不允许的,可以使用git stash把修改的文件暂存起来,等切换过来后在使用git stash apply 恢复之前的状态

提交记录

$ git log --all # 查看提交日志

$ git log --author=myname  # 查看指定用户的提交记录

$ git log --cherry develop  # 查看指定分支提交记录

合并

$ git merge hotfix # hotfix代码合并到master分支(相当于在master分支上拉取hotfix分支代码), 注意合并前先checkout到master分支

$ git merge develop --squash  # 作为一个整体合并到当前分支,不会将develop里面乱七八糟的提交记录更新到当前分支,这相当于copy 操作,所以执行merge后还需要再次commit 。

$ git merge <commit-id>  # 根据提交记录合并

$ git merge 合并的时候有冲突解决完 执行git rebase --continue 来继续合并。 

指定文件合并,例如将bug分支explain_edit.html文件合并到develop分支explain_edit.html,可以这样操作

$ git checkout develop  # 先切换到develop

$ cd zhishidian/themes/manager/knowledge/explain  # 进入文件所在文件夹

$ git checkout bug -- explain_edit.html  # 合并文件,合并后文件处于修改状态,注意--后面有空格。

标签使用

$ git tag -a v0.1.2 -m "发布0.1.2版本" # 创建标签

$ git fetch --tags  # 获取标签

$ git checkout [tagname] # 切换标签与切换分支命令相同

$ git show v0.1.2 # 查看标签信息

$ git tag -d v0.1.2 # 删除标签

$ git push origin :refs/tags/标签名 

$ git tag -a v0.1.1 9fbc3d0 # 补打标签,"9fbc3d0"通过git log获取某个提交对象的校验

$ git push origin v0.1.2 # 将v0.1.2标签提交到git服务器

$ git push origin v0.1.2:refs/tags/v0.1.2   # 指定标签提交到服务器指定位置

$ git push origin --tags # 将本地所有标签一次性提交到git服务器

$ git tag -l or --list  # 查看所有标签

$ git for-each-ref --sort=taggerdate --format '%(tag)' refs/tags|tail -3  # 按时间倒序取最后3条

# 也可以这样排序

git log --tags --decorate --simplify-by-decoration

git log --tags --simplify-by-decoration --pretty="format:%ai %d"

其它

$ git rebase branch_name # 分支变基,已指定分支为基础,把当前分支已经提交的记录在追加到指定更新的分支上,这和当前分支上使用pull other_branch结果是一样的,只是执行过程不一样

$ git rebase --abort # 终止rebase,如果rebase过程中遇到冲突问题,可以使用--abort参数终止操作,解决冲突后还可以使用--continue继续rebase

$git show HEAD # 查看当前分支当前的历史状态,HEAD表示当前分支最新版本,HEAD^表示HEAD父母的信息,HEAD~4表示HEAD上溯四代的信息 

git是不能add空目录的,如果想add空目录的,则需要在目录里面添加一个文件才能正常添加上,这个时候可添加.gitignore文件当一个占位符。

如果想一个(大)文件永久删除,既不要在版本库历史记录里面看到也不要占用版本库空间的话,可以使用filter-branch,具体用法参考官方文档。

$ git filter-branch --tree-filter 'rm -f testme.txt' HEAD 

$ git diff settings.py  # 对比文件修改内容

总结:

git里面的文件有以下几种状态

--未跟踪 (untracked)

--已跟踪 (tracked)

  --已修改 (modified)

  --已暂存 (staged)

  --已提交 (commited)

  --正常

拓展知识

SSH登录使用RSA证书认证代替密码认证

创建RSA证书

打开git bash后输入 ssh-keygen -t rsa -C "youname@example.com" 之后会在C:UsersAdministrator.ssh生成两个文件id_rsa,id_rsa.pub,这两个一个是私钥,一个是公钥,创建过程中会提示输入密码,直接忽略就行了。

把已生成的id_rsa.pub(公钥)上传到linux服务器上后,把该文件内容添加到/root/.ssh/authorized_keys文件中

可以使用如下命令:

$ scp ~/.ssh/id_rsa.pub root@192.168.0.124:/tmp/id_rsa3.pub # 使用git bash将本地文件上传到服务器

# cat /tmp/id_rsa.pub >> /root/.ssh/authorized_keys

使用git bash登录linux服务器

$ ssh root@192.168.0.126 或 $ ssh -l username remotehost  
$ ssh root@192.168.0.126 -p6022  # 带端口访问

退出ssh可以使用exit命令

git命令自动补全

$ find / -name git-completion*
$ cp /usr/share/doc/git-1.8.3.1/contrib/completion/git-completion.bash ~/.git-completion.bash
$ chmod +x ~/.git-completion.bash # 设置执行权限
在 .bashrc 中加入下面这行代码,然后执行source ~/.bashrc 使其生效。
source ~/.git-completion.bash

这几篇Git文章写的不错

Git 版本管理工具(一)

http://blog.csdn.net/ithomer/article/details/7527877

Git 常用命令详解(二)

http://blog.csdn.net/ithomer/article/details/7529022

Git 常用命令速查表(三)

http://blog.csdn.net/ithomer/article/details/7529841 

http://rongjih.blog.163.com/blog/static/335744612010112562833316/

原文地址:https://www.cnblogs.com/weiok/p/4772771.html