常用的git指令

658 查看

配置个人资料

git config --global user.email william0760@qq.com
git config --global user.name "William Wen"
git config --list

生成公钥SSH

安装git,打开Git Bash

ssh-keygen -t rsa -C "william0760@qq.com"

之后会生成id_rsa与id_rsa.pub
id_rsa.pub为公钥,把它贴到托管网站(如github, git@OSC)
要注意托管代码需要使用SSH,不是HTTP

版本操作

git clone https://xxx : 提取远程上的最新代码并初始化
git reset --hard HEAD : 完全恢复到最早的版本,无视所有commit
git reset –mixed <commit_id>:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
git reset –-soft <commit_id>:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
git reset –-hard <commit_id>:彻底回退到某个版本,本地的源码也会变为上一个版本的内容
 
git checkout HEAD : 回滚最新的代码 (history > Working Directory)
git checkout xxx.php: 还原单个文件 (history -> Working Directory)
 
git add *.cpp *.h  (你修改了文件 或者第一次git init接着使用这个命令   使用IDE的最好也把一些配置文件加进去)
git add ./path
-------------如果你add了,但想取消怎办?千万不要使用git rm,它将会删除文件,请使用git reset,或者使用git rm --cached xxx.cpp(这个好点,因为它只是把文件状态变成untracked,而没有修改文件)
git rm : 删除文件或目录
git mv : 移动或重命名
 
git commit (stage -> history)
git commit -a -m "your message" (提交所有已经git add过的代码) (Working Directory -> history)
git commit --amend -m"your message"     (你保存得过于频繁,可将此次的commit和上一次commit合并)
 
git fetch: 相当于是从远程获取最新版本到本地,不会自动merge
git fetch origin: 从“origin”资源库取得所有的历史记录而不改变本地的副本.
git pull: 相当于是从远程获取最新版本并merge到本地副本
git push: 提交版本到远程
git stash: 保存当前改动并还原未改动状态,通常用于代码修改中临时切换分支
git stash pop: 恢复改动记录

分支操作

git branch <name> 新建分支
git branch -d <name> 删除分支
git merge test        把test分支合并到当前分支上       (合并之后  git会在发生冲突的文件上标出冲突   自己打开这些文件手工解决冲突  如果不解决不能commit)
git checkout test   切换到test分支 (history -> Working Directory)git rebase my_branch: 把my_branch分支合并到当前副本中

查询操作

git diff (当你了修改文件并保存了,使用这个命令观察下)
git diff abcde (对比特定版本,至少版本号前5位)
git status (自己使用观察下)
git log -p (当你修改了文件,再使用git commit -m "XXX"时候,再用这个命令看看)
git log --stat --summary (大致的LOG信息)
git log --grep "search text" (搜索匹配内容的LOG)
git log filename (某文件所有修改记录)
git branch 查看分支
git show commit_id (查看某次提交的修改细节)
git branch --contains <commit-id> 某个commit的所属分支

组合指令

对现有源代码建立GIT库

git init
git add --all ( or git add .)
git commit -m "init"

打包上两个版本的差异文件

git archive -o latest.zip HEAD $(git diff HEAD^ --name-only)
或
git diff HEAD^^ --name-only > list.txt
cat list.txt | xargs -i  tar rvPf  latest.tar  {}

Applying and creating patches

git apply xxxx.patch

git format-patch HEAD^^ --stdout > (issue id)-title.patch // 把上一次commit的内容转为补丁

更新submodule,git clone不会自动下载submodule

git submodule update --init --recursive