Git基本用法

设置用户名与邮箱
git config –global user.name “My Name”
git config –global user.email “my@email.com”

从已有的git库中提取代码
git clone git@server:app.git myrepo

每次更改代码的操作

更新本地代码到最新版本(需要merge才能合到本地代码中)
git fetch

合并更新后的代码到本地
git merge

更新代码方式的另一种方法(git pull是git fetch和git merge命令的一个组合)
git pull

修改代码后,查看已修改的内容
git diff –cached

将新增加文件加入到git中
git add file1 file2 file3

从git中删除文件
git rm file1
git rm -r dir1

提交修改
git commit -m ‘this is memo’

如果想省掉提交之前的 git add 命令,可以直接用
git commit -a -m ‘this is memo’
commit和commit -a的区别, commit -a相当于:
第一步:自动地add所有改动的代码,使得所有的开发代码都列于index file中
第二步:自动地删除那些在index file中但不在工作树中的文件
第三步:执行commit命令来提交

提交所有修改到远程服务器,这样,其它团队成员才能更新到这些修改
git push

其它常用命令

显示commit日志
git log

不仅显示commit日志,而且同时显示每次commit的代码改变。
git log -p

回滚代码:
git revert HEAD

你也可以revert更早的commit,例如:
git revert HEAD^

将branchname分支合并到当前分支中。(如果合并发生冲突,需要自己解决冲突)
git merge branchname

创建 git 仓库

初始化 git 仓库
mkdir project # 创建项目目录
cd project # 进入到项目目录
git init # 初始化 git 仓库。此命令会在当前目录新建一个 .git 目录,用于存储 git 仓库的相关信息

初始化提交
touch README
git add . # 将当前目录添加到 git 仓库中, 使用 git add -A 则是添加所有改动的文档
git commit -m “Initial commit”
git remote add origin git@github.com:lugir/repo.git # 设置仓库

修补提交(修补最近一次的提交而不创建新的提交)
git commit –amend -m “commit message.”

提交冲突时可以合并后再推送
git pull # 获取远程版本库提交与本地提交进行合并
git push # 提交

使用别人的仓库
git clone http://path/to/git.git # clone 的内容会放在当前目录下的新目录

将代码从本地回传到仓库
git push -u origin master

使用 git status 查看文件状态
git status

查看提交日志
git log # 查看提交信息
git log –pretty=oneline # 以整洁的单行形式显示提交信息

Git 分支

git branch # 查看分支
git branch 6.x-1.x # 添加分支 6.x-1.x
git branch checkout master # 切换到主分支
git branch -d 6.x-1.x # 删除分支 6.x-1.x
git push origin :branchname # 删除远端分支

Git 标签

git tag # 查看分支
git tag 6.x-1.0 # 添加标签 6.x-1.0
git show 6.x-1.0 # 查看标签 6.x-1.0 的信息
git tag -a 6.x-1.0 965e066 # 为之前提交的信息记录 965e066 加上标签
git push –tags # 提交时带上标签信息
git push origin :/refs/tags/tagname # 删除远端标签

从 git 仓库中导出项目
git archive –format tar –output /path/to/file.tar master # 将 master 以 tar 格式打包到指定文件
git archive –format zip –output /full/path/to/zipfile.zip master # 以 zip 格式打包 master
git archive master | tar -x -C /somewhere/else # 将master文件导出另外一个文件夹

使用 Git 的一些基本守则:

当要commit/提交patch时:
使用 git diff –check 检查行尾有没有多余的空白
每个 commit 只改一件事情。如果一个文档有多个变更,使用 git add –patch 只选择文档中的部分变更进入 stage
写清楚 commit message

缓存本地更改,防止切换到其它分支覆盖本地修改:
git stash
git pull
git stash pop

更新子模块:
git submodule foreach git pull origin master

创建新分支:
git checkout -b kyle-dev

强制用远程的覆盖本地修改:
git fetch –all
git reset –hard origin/master

签出远程的test分支:
git pull
git checkout test

撤消上一次的commit:
git reset –soft HEAD^

将本地的tag提交到远程:
git tag -a v1.0 -m ‘version 1.0’
git push/pull –tags origin master

删除远程tag:
git tag -d v2.1.3
git push origin :refs/tags/v2.1.3
git push origin –delete tag
git push origin –delete

克隆本地名称为old的tag 为 new:
git tag new old

git 忽略 submodule项目的更改,在.gitmodules文件中添加 ignore = all (https://www.kernel.org/pub/software/scm/git/docs/gitmodules.html) 例如:
[submodule “bundle/fugitive”]
path = bundle/fugitive
url = git://github.com/tpope/vim-fugitive.git
ignore = all

git 回退五个提交:
git reset –hard HEAD~5
或具体某个版本:
git reset –hard commit_sha

搭gitlab的时候,ssh keys认证不了,原因为 .ssh 目录 及 .ssh/authorized_keys 文件的权限设置不正确,分别为 775 和 644就行了。
>>>/home/git/gitlab$ sudo -u git -H bundle exec rake gitlab:shell:setup RAILS_ENV=production

添加子模块:
git submodule add git@git.github.com:server.git deps/server
配置文件为 .gitmodules

更改子模块的远程地址:
修改.gitmodules文件中的地址,然后 :git submodule sync

强制用远程分支的代码,在合并代码有大量冲突的情况:
# fetch from the default remote, origin
git fetch
# reset your current branch (master) to origin’s master
git reset –hard origin/master

回滚单个文件:
git checkout v1.2.3 — filename # tag v1.2.3
git checkout stable — filename # stable branch
git checkout origin/master — filename # upstream master
git checkout HEAD — filename # the version from the most recent commit
git checkout HEAD^ — filename # the version before the most recent commit
其中–用来区分文件名和tag名字等,防止出现文件名与分支名、tag名一致的情况。

将一个分支的某个文件合并到另一个分支去:
git checkout otherbranch myfile.txt

只合并某个分支的某个提交:
git cherry-pick 38361a68

强制回滚远程到旧的版本:
git push -f origin $old_commit_id:master
What will this do? It will push the $old_commit_id commit to origin as the new head of origin’s master branch.

查看当前commit的hash值
git rev-parse HEAD
git rev-parse –short HEAD

git 删除错误提交的commit 方法:
git reset –hard <commit_id>
git push origin HEAD –force

给git设置socket代理:git config –global https.proxy ‘socks5://127.0.0.1:1080’,取消代理:git config –global –unset https.proxy,还有一个全局配置 http.proxy 也可以同样配置

$ git config –global -l
https.proxy=socks5://127.0.0.1:1080
http.proxy=socks5://127.0.0.1:1080
core.gitproxy=git-proxy
socks.proxy=localhost:1080

git禁止push操作,只允许pull:
$ git remote set-url –push origin no-pushing
$ git push
fatal: ‘no-pushing’ does not appear to be a git repository
fatal: The remote end hung up unexpectedly

现在位于 test分支,想让test分支下面的文件 /path/file1.php 强制使用 master分支的:
git show master:path/file1.php > path/file1.php

批量删除本地的 untrack files:
git clean -id

要查找日期之间的git commit记录,比如想查 2017-08-04和05号这两天的记录,有两种方法:
git log –format=format:”%ai %aE %s” | grep “2017-08-0”
git log –until 2017-08-06 –since 2017-08-04