Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Git 必知必会 #40

Open
libin1991 opened this issue Jan 28, 2018 · 0 comments
Open

Git 必知必会 #40

libin1991 opened this issue Jan 28, 2018 · 0 comments

Comments

@libin1991
Copy link
Owner

libin1991 commented Jan 28, 2018

Git是目前世界上最先进的分布式版本控制系统。

参考文章:

如何优雅地使用 Git - 掘金

GIT 常见命令学习整理

GIT常用命令备忘

Git远程操作详解

一篇文章,教你学会Git

如何在 Git 中使用撤消操作

git使用中碰到的问题,持续更新

Git 的 4 个阶段的撤销更改

Git提交历史的修改删除合并 - 掘金

IDEA中分支切换error: The following untracked working tree files would be overwritten by checkout

直接执行git clean -d -fx即可。

可能很多人都不明白-d,-fx到底是啥意思,
其实git clean -d -fx表示:删除 一些 没有 git add 的 文件;
    git clean 参数 

    -n 显示将要删除的文件和目录;

    -x -----删除忽略文件已经对git来说不识别的文件

    -d -----删除未被添加到git的路径中的文件

    -f -----强制运行

    git clean -n

    git clean -df

    git clean -f

git reflog        //该指令输出详细的操作历史,包括提交,操作,修改等
修改注释
git commit --amend 或 git commit --amend -m "Fixes bug #42"

gitk 字符集编码:
git config --global gui.encoding utf-8    //在git GUI中使用UTF-8编码 

配置
git config --global user.name "ihoey"           # 设置git用户名
git config --global user.email "[email protected]" # 设置git邮箱
git config --global color.ui true               # 为true是终端着色

git config --global alias.co checkout           # 配置checkout的别名
git config --global alias.ci commit             # 配置commit的别名
git config --global alias.cm commit             # 配置commit的别名
git config --global alias.st status             # 配置status的别名
git config --global alias.br branch             # 配置branch的别名
git config --global alias.cp cherry-pick        # 配置cherry-pick的别名
 git config --global alias.rb rebase            # 配置rebase的别名

git config --global core.editor "mate -w"       # 设置Editor使用textmate
git config -l                                   # 列举所有配置
#用户的git配置文件~/.gitconfig

SSH 秘钥
ssh-keygen -t rsa -C "[email protected]"
# 连续3个回车。如果不需要密码的话。
# 最后得到了两个文件:id_rsa和id_rsa.pub,在~/.ssh/文件夹下面
# id_rsa为你的私钥,不可以告诉别人
# id_rsa.pub为你的公钥,一般会放在你的服务器做ssh登录,或者放在github上面

基本命令
创建git仓库 git init
添加文件到暂存区 git add fileName / git add .
提交文件到仓库 git commit -m "版本提交信息"
查看文件提交状态 git status
查看文件修改的信息 git diff readme.txt

git help <command>          # 显示command的help
git show                    # 显示某次提交的内容
git show $id
git checkout  -- <file>     # 抛弃工作区修改
git checkout  .             # 抛弃工作区修改
git add <file>              # 将工作文件修改提交到本地暂存区
git add .                   # 将所有修改过的工作文件提交暂存区
git rm <file>               # 从版本库中删除文件
git rm <file> --cached      # 从版本库中删除文件,但不删除文件
git reset <file>            # 从暂存区恢复到工作文件
git reset -- .              # 从暂存区恢复到工作文件
git reset --hard            # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
git reset SHA1 ID           # 恢复指定提交
git commit -m "some comments"
git revert <$id>            # 恢复某次提交的状态,恢复动作本身也创建了一次提交对象
git revert HEAD             # 恢复最后一次提交的状态

查看文件
git diff <file>                 # 比较当前文件和暂存区文件差异
git diff
git diff <$id1> <$id2>          # 比较两次提交之间的差异
git diff <branch1>..<branch2>   # 在两个分支之间比较
git diff --staged               # 比较暂存区和版本库差异
git diff --cached               # 比较暂存区和版本库差异
git diff --stat                 # 仅仅比较统计信息

查看提交记录
git log
git log <file>      # 查看该文件每次提交记录
git log -p <file>   # 查看每次详细修改内容的diff
git log -p -2       # 查看最近两次详细修改内容的diff
git log --stat      # 查看提交统计信息

分支管理
git branch -l                           # 查看本地分支
git branch -r                           # 查看远程分支
git branch <new_branch>                 # 创建新的分支
git branch -v                           # 查看各个分支最后提交信息
git branch --merged                     # 查看已经被合并到当前分支的分支
git branch --no-merged                  # 查看尚未被合并到当前分支的分支
git checkout <branch>                   # 切换到某个分支
git checkout -b <new_branch>            # 创建新的分支,并且切换过去
git checkout -b <new_branch> <branch>   # 基于branch创建新的new_branch
git checkout $id       # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
git checkout $id -b <new_branch>        # 把某次历史提交记录checkout出来,创建成一个分支
git branch -d <branch>                  # 删除某个分支
git branch -D <branch>    # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)

强行切换分支
git checkout -f branch_name

强制checkout分支覆盖本地文件
git checkout -f branchname

分支合并和rebase
git merge <branch>               # 将branch分支合并到当前分支
git merge --no-ff <branch>       # 不要Fast-Foward合并,这样可以生成merge提交
git rebase master <branch>       # 将master rebase到branch,相当于:
git checkout <branch> && git rebase master && git checkout master && git merge <branch>
  • 在我们操作过程中。merge操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。
  • 而rebase 操作的话,会中断rebase,同时会提示去解决冲突。解决冲突后,将修改add后执行git rebase –continue继续操作,或者git rebase –skip忽略冲突。
     Git暂存管理
     git stash                        # 暂存
     git stash pop                    # 恢复暂存
     git stash list                   # 列所有stash
     git stash apply                  # 恢复暂存的内容
     git stash drop                   # 删除暂存区
     
     git stash(gsta):将所有暂存区的文件移动到“储藏区”,类似于另一种类型的工作区
     git stash list:查看储藏队列(Stash lists)
     git stash apply:将最近一次储藏恢复到暂存区(可以用类似 git stash apply stash@{num}(num从0开始计数) 的命令来使用在队列中的任意一个储藏(stashes))
     git stash clear:清空储藏队列
     git stash save "name of the stash":为储藏设置命名
     git stash pop(gstp):将最近一次储藏恢复到暂存区并从储藏队列删除此储藏
     git stash drop(gstd):从储藏队列删除最近一次储藏(stash@{0})(git stash drop stash@{num} 从储藏队列删除指定储藏)
     
     远程分支管理
     git pull                         # 抓取远程仓库所有分支更新并合并到本地
     git pull --no-ff                 # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
     git fetch origin                 # 抓取远程仓库更新
     git merge origin/master          # 将远程主分支合并到本地当前分支
     git checkout --track origin/branch     # 跟踪某个远程分支创建相应的本地分支
     git checkout -b <local_branch> origin/<remote_branch>  # 基于远程分支创建本地分支,功能同上
     git push                         # push所有分支
     git push origin master           # 将本地主分支推到远程主分支
     git push -u origin master        # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
     git push origin <local_branch>   # 创建远程分支, origin是远程仓库名
     git push origin <local_branch>:<remote_branch>  # 创建远程分支
     git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支
    
     git删除远程分支
     git push origin :branch-name //origin前面必须有空格,表示push一个空分支到远程分支,即可删除远程分支。注意:这个操作需要拥有force push的权限
     
     清空git暂存区
     git reset HEAD  //可以清空之前git add 的内容
     
     Git远程仓库管理
     git remote -v                    # 查看远程服务器地址和仓库名称
     git remote show origin           # 查看远程服务器仓库状态
     git remote add origin [email protected]:ihoey/blog.git     # 添加远程仓库地址
     git remote set-url origin [email protected]:ihoey/blog.git # 设置远程仓库地址(用于修改远程仓库地址)
     git remote rm <repository>       # 删除远程仓库
     
     创建远程仓库
     git clone --bare ihoey.com blog.git     # 用带版本的项目创建纯版本仓库
     scp -r my_blog.git [email protected]:~      # 将纯仓库上传到服务器上
     mkdir blog.git && cd blog.git && git --bare init # 在服务器创建纯仓库
     git push -u origin master         # 客户端首次提交
     git push -u origin develop        # 首次将本地develop分支提交到远程develop分支,并且track
     git remote set-head origin master # 设置远程仓库的HEAD指向master分支
     
     设置跟踪远程库和本地库
     git branch --set-upstream master origin/master      #master
     git branch --set-upstream develop origin/develop    #develop
     
     其他命令
     mkdir XX    #(创建一个空目录 XX指目录名)
     pwd         #显示当前目录的路径。
     cat XX      #查看XX文件内容
     rm  XX      #删除文件
     
    

命令别名设置:

gitk --all &   //打开git 图形化界面
git fetch --all  //刷新工作区    
git remote -v  //查看远端地址
git checkout -b dbg_master  -t origin/master   //基于远端master分支创建dbg_master分支
git merge --squash <branch>:将多次提交合并成一个,然后git add .;git commit -m "XXXXX";git push origin XXXX...
 
git push                         # push所有分支
git push origin master           # 将本地主分支推到远程主分支
git push -u origin master        # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch>   # 创建远程分支, origin是远程仓库名
git push origin local-branch     #将当前local-branch 分支推送一个远程local-branch分支,本地分支和远程分支同名
git push origin <local_branch>:<remote_branch>  # 创建远程分支,将local_branch代码推送到remote_branch分支
git push origin :<remote_branch>  #先删除本地分支(git br -d <branch>),然后再push删除远程分支
 
 对最近一次commit的进行修改:git commit -a –amend

 Git pull 强制覆盖本地文件
  git fetch --all  
  git reset --hard origin/master 
  git pull

git remote add origin https://git.oschina.net/duandaoke/os.git要求服务已经建立同名仓库
git remote # 显示远程仓库
git remote -v # 显示远程仓库详情
git remote show origin # 显示 origin 远程库的详情



rebase的冲突解决

   解决完一个补丁应用的冲突后,执行下面命令标记冲突已解决(也就是把修改内容加入缓存) 
      git add -u   //注:-u 表示把所有已track的文件的新的修改加入缓存,但不加入新的文件。
   然后执行下面命令继续rebase:
      git rebase --continue     //有冲突继续解决,重复这这些步骤,直到rebase完成。
   如果中间遇到某个补丁不需要应用,可以用下面命令忽略:
      git rebase --skip 
   如果想回到rebase执行之前的状态,可以执行:
      git rebase --abort    //放弃rebase  
   注:rebase之后,不需要执行commit,也不存在新的修改需要提交,都是git自动完成。



cherry-pick的冲突解决

   解决完一个补丁应用的冲突后,执行下面命令标记冲突已解决(也就是把修改内容加入缓存) 
      git add -u   //注:-u 表示把所有已track的文件的新的修改加入缓存,但不加入新的文件。
   然后执行下面命令继续rebase:
      git cherry-pick --continue     //有冲突继续解决,重复这这些步骤,直到cherry-pick完成。
   如果中间遇到某个补丁不需要应用,可以用下面命令忽略:
      git cherry-pick --skip 
   如果想回到rebase执行之前的状态,可以执行:
      git cherry-pick  --abort    //放弃cherry-pick
   注:cherry-pick之后,不需要执行commit,也不存在新的修改需要提交,都是git自动完成。

  
       手动编辑冲突的文件,使其内容和master_mlc分支上的内容一致, 
       然后git add此文件,最后执行git cherry-pick –continue即可。 


1、git删除远程分支
git push origin :branch-name //origin前面必须有空格,表示push一个空分支到远程分支,即可删除远程分支。注意:这个操作需要拥有force push的权限
2、清空git暂存区
git reset HEAD  //可以清空之前git add 的内容


git clean命令用来从你的工作目录中删除所有没有tracked过的文件.
    git clean经常和git reset --hard一起结合使用. 记住reset只影响被track过的文件, 所以需要clean来删除没有track过的文件. 结合使用这两个命令能让你的工作目录完全回到一个指定的<commit>的状态.
用法


删除当前目录下没有被track过的文件和文件夹.
    git clean -xf


下面的例子要删除所有工作目录下面的修改, 包括新添加的文件. 假设你已经提交了一些快照了, 而且做了一些新的开发.
git reset --hard
git clean -df
运行后, 工作目录和缓存区回到最近一次commit时候一摸一样的状态, git status会告诉你这是一个干净的工作目录, 又是一个新的开始了.


git config --global gui.encoding utf-8    //在git GUI中使用UTF-8编码     
//git 回滚到之前某一commit
git reset –hard 8ff24a6803173208f3e606e32dfcf82db9ac84d8


在使用Git的时候,经过几次提交后,发现需要回退到早些时候的状态.例如: 
7edb8524a xxxxxxxxxxxxxxxxxx 
83dae5691 xxxxxxxxxxxxxxxxxx 
45eadd642 xxxxxxxxxxxxxxxxxx 
657834ade xxxxxxxxxxxxxxxxxx
假设现在处于7edb8524a 状态,现在我想回退到657834ade时的状态,此时可以 
git reset –hard 7edb8524a 
然后 
git reset –soft 657834ade 
会将之间的修改全部进行revert,然后在进行add commit操作就行了.
另外权限足够的话,可以从657834ade 拉一个分支出来,然后将远程分支 
删除,再将拉出来的分支push到远程仓库上,成为原来的分支,也可以实现回退到 
657834ade 的目的.此方法不会保留中间的各种修改信息和状态.


根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:
    git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息
    git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可
    git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容

已经push
对于已经把代码push到线上仓库,你回退本地代码其实也想同时回退线上代码,回滚到某个指定的版本,线上,线下代码保持一致.你要用到下面的命令

revert
git revert用于反转提交,执行evert命令时要求工作树必须是干净的.
git revert用一个新提交来消除一个历史提交所做的任何修改.
revert 之后你的本地代码会回滚到指定的历史版本,这时你再 git push 既可以把线上的代码更新.(这里不会像reset造成冲突的问题)

revert 使用,需要先找到你想回滚版本唯一的commit标识代码,可以用 git log 或者在adgit搭建的web环境历史提交记录里查看.
git revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61
通常,前几位即可
git revert c011eb3

git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
看似达到的效果是一样的,其实完全不同.

合理的命令别名设置可以大大减少输入,有助于提高工作效率,建议遵守下述别名设置:

git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.st status
git config --global alias.rb rebase
git config --global alias.ll “log --oneline --decorate --color”
git config --global alias.lc “log --graph --color”          

正确的回车换行设置,避免 Unix 和 Windows 下开发的回车换行的转换问题。

(Windows  下)
git config --global core.autocrlf true
git config --global core. safecrlf warn

(Linux  下)
git config --global core.autocrlf input
git config --global core. safecrlf warn

基本命令

git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git config --global core.editor <your favorite editor here>
Ex: git config --global core.editor vim

git init:初始化一个repo,初始化本地git仓库(创建新仓库)

Commit 结构

git status(gst):查看 repo 状态
工作区:
.git 目录
暂存区
工作目录

git add <filename>(ga):添加一个文件到暂存区
git add .(gaa):添加所有文件到暂存区
git add *.js:添加所有后缀为js的文件到暂存区
git rm --cached <file>:从暂存区删除一个新文件
git commit -m "My first commit"(gcmsg):创建一次带 message 的提交
git commit -v -a(gca):
-v是 verbose 的缩写,会在底部显示差异信息和更多有意义的信息
-a 类似于 git add .,会添加所有被修改和删除的文件,但会忽略新创建的文件

git help <command>:查看对应命令的帮助手册
git log(glg,glgg,glo, glog):查看项目的提交历史

暂存区管理

git reset HEAD <filename>(grh):从暂存区删除一个被修改的文件
git reset HEAD(grh):从暂存区删除所有被修改的文件
git checkout <filename>(gco):从暂存区删除一个被修改的文件,并撤销文件的更改     //  git checkout .
git commit -m "My first commit" --amend:添加文件/更改在暂存区的最后一次提交
git commit -v -a --amend(gca!):添加文件/更改在暂存区的最后一次提交
.gitignore:告诉git,哪些文件不被加入版本跟踪
可以使用 git add <filename> -f 命令添加一个不被版本跟踪的文件


git diff <filename>(gd):查看基于当前文件的最后一次提交的更改差异
git diff (gd):查看基于所有文件的最后一次提交的更改差异
git reset HEAD~2 --soft:从项目提交历史中删除最近两次提交,但不丢弃文件的更改
git reset HEAD~2 --hard:从项目提交历史中删除最近两次提交,但会丢弃文件的更改和在(最后两次)提交中创建的新文件
git reset <commit> --soft --hard:
--soft:将所有被更改的文件回溯到“待提交”状态
--hard:commit 之后,对被git追踪的文件的任何更改都被丢弃


git reflog:显示包括"被撤销"在内的所有提交
git merge <commit hash>:重新提交(restore the commit)
git clean -f:删除工作目录中不被git进行版本追踪的文件

Stashed & BranchesStash

git stash(gsta):将所有暂存区的文件移动到“储藏区”,类似于另一种类型的工作区
git stash list:查看储藏队列(Stash lists)
git stash apply:将最近一次储藏恢复到暂存区(可以用类似 git stash apply stash@{num}(num从0开始计数) 的命令来使用在队列中的任意一个储藏(stashes))
git stash clear:清空储藏队列
git stash save "name of the stash":为储藏设置命名
git stash pop(gstp):将最近一次储藏恢复到暂存区并从储藏队列删除此储藏
git stash drop(gstd):从储藏队列删除最近一次储藏(stash@{0})(git stash drop stash@{num} 从储藏队列删除指定储藏)

Branch

git checkout -b dev(gco):创建 dev 分支并从当前分支切换到 dev 分支      //  git checkout -b dbg_master  -t origin/master   //基于master分支创建dbg_master分支
git branch(gb):查看所有分支
git checkout master(gcm):切换到主分支
git merge <branch>(gm):合并分支
git rebase master:先将 master 上的更改合并到当前分支,再添加当前分支的更改。如果有冲突,解决冲突后加 --continue 参数继续合并
git branch -d <branch>: 删除分支,-D 则强制删除分支
git merge <branch> --squash:将多次提交合并成一个,其流程如下:



# Go to the `master` branch
git checkout master
# Create a temp branch
git checkout -b temp
# Merge the feature/x branch into the temp using --squash
git merge feature/x --squash
# See the new modifications/files in the Staging Area
git status
# Create the unified commit
git commit -m "Add feature/x"
# Delete the feature/x branch
git branch -D feature/x
  • rebase 和 merge 的区别:

    rebase:
    提交历史(的展示)是线性的
    缺点:会删除最近一个 commit,然后创建一次新的 commit
    如果已提交到远程,不要使用 rebase

    merge:
    提交历史(的展示)是分叉的
    对于两个分支的合并,会创建一个次新的 commit

远程仓库管理

git remote add <name> <url>:添加一个将被追踪的远程仓库
git remote rm <name>:移除一个远程仓库
git push <remote> <remote-branch>(gp,ggp):将当前分支的本地 commit 推送到远程仓库
git fetch <remote> <remote-branch>:拉取远程仓库的最新 commit 到当前(本地)分支(<remote>/<branch>),不会合并
git pull <remote> <remote-branch>(gl,ggl):拉取远程仓库的最新 commit 到当前(本地)分支,并自动 merge
git pull --rebase(gup):以 rebase 的方式进行合并,而不是 merge

其它有用的命令

git tag <name>:创建一个 tag(如:v1.3)
git push --tags:将本地 tags 推送到远程仓库
git push <tag>:推送指定的本地 tag 到远程


展示帮助信息
git help -g

回到远程仓库的状态
抛弃本地所有的修改,回到远程仓库的状态。
git fetch --all && git reset --hard origin/master

重设第一个commit
也就是把所有的改动都重新放回工作区,并清空所有的commit,这样就可以重新提交第一个commit了
git update-ref -d HEAD

展示工作区和暂存区的不同
输出工作区和暂存区的different(不同)。
git diff

还可以展示本地仓库中任意两个commit之间的文件变动:
git diff <commit-id> <commit-id>

展示暂存区和最近版本的不同
输出暂存区和本地最近的版本(commit)的different(不同)。
git diff --cached

展示暂存区、工作区和最近版本的不同
输出工作区、暂存区 和本地最近的版本(commit)的different(不同)。
git diff HEAD

快速切换分支
git checkout -

删除已经合并到master的分支
git branch --merged master | grep -v '^\*\|  master' | xargs -n 1 git branch -d

展示本地分支关联远程仓库的情况
git branch -vv

关联远程分支
关联之后,git branch -vv就可以展示关联的远程分支名了,同时推送到远程仓库直接:git push,不需要指定远程仓库了。
git branch -u origin/mybranch

或者在push时加上-u参数
git push origin/mybranch -u

列出所有本地分支
-l参数相当于:local
git branch -l

列出所有远程分支
-r参数相当于:remote
git branch -r

列出本地和远程分支
-a参数相当于:all
git branch -a

创建并切换到本地分支
git checkout -b <branch-name>

创建并切换到远程分支
git checkout -b <branch-name> -t origin/<branch-name>

删除本地分支
git branch -d <local-branchname>

删除远程分支
git push origin --delete <remote-branchname>
或者
git push origin :<remote-branchname>

重命名本地分支
git branch -m <new-branch-name>
git branch -m <oldbranchname> <newbranchname>:尝试修改
git branch -M <oldbranchname> <newbranchname>:强制修改

查看标签
git tag

展示当前分支的最近的tag
git describe --tags --abbrev=0

本地创建标签
git tag <version-number>

默认tag是打在最近的一次commit上,如果需要指定commit打tag:
$ git tag -a <version-number> -m "v1.0 发布(描述)" <commit-id>

推送标签到远程仓库
首先要保证本地创建好了标签才可以推送标签到远程仓库:
git push origin <local-version-number>

一次性推送所有标签,同步到远程仓库:
git push origin --tags

删除本地标签
git tag -d <tag-name>

删除远程标签
删除远程标签需要先删除本地标签,再执行下面的命令:
git push origin :refs/tags/<tag-name>

切回到某个标签
一般上线之前都会打tag,就是为了防止上线后出现问题,方便快速回退到上一版本。下面的命令是回到某一标签下的状态:
git checkout -b branch_name tag_name

放弃工作区的修改
git checkout <file-name>

放弃所有修改:
git checkout .

恢复删除的文件
git rev-list -n 1 HEAD -- <file_path> #得到 deleting_commit
git checkout <deleting_commit>^ -- <file_path> #回到删除文件 deleting_commit 之前的状态

回到某一个commit的状态,并重新增添一个commit  //回退,有记录
git revert <commit-id>

回到某个commit的状态,并删除后面的commit
和revert的区别:reset命令会抹去某个commit id之后的所有commit
git reset <commit-id>

修改上一个commit的描述
git commit --amend

查看commit历史
git log

查看某段代码是谁写的
blame的意思为‘责怪’,你懂的。
git blame <file-name>

显示本地执行过git命令
就像shell的history一样
git reflog

修改作者名
git commit --amend --author='Author Name <[email protected]>'

修改远程仓库的url
git remote set-url origin <URL>

增加远程仓库
git remote add origin <remote-url>

列出所有远程仓库
git remote    //  git remote -v

查看两个星期内的改动
git whatchanged --since='2 weeks ago'

把A分支的某一个commit,放到B分支上
这个过程需要cherry-pick命令,参考
git checkout <branch-name> && git cherry-pick <commit-id>

给git命令起别名
简化命令
git config --global alias.<handle> <command>
比如:git status 改成 git st,这样可以简化命令
git config --global alias.st status

存储当前的修改,但不用提交commit
详解可以参考廖雪峰老师的git教程

git stash
保存当前状态,包括untracked的文件

untracked文件:新建的文件
git stash -u

展示所有stashes
git stash list

回到某个stash的状态
git stash apply <stash@{n}>

回到最后一个stash的状态,并删除这个stash
git stash pop

删除所有的stash
git stash clear

从stash中拿出某个文件的修改
git checkout <stash@{n}> -- <file-path>

展示所有tracked的文件
git ls-files -t

展示所有untracked的文件
git ls-files --others

展示所有忽略的文件
git ls-files --others -i --exclude-standard

强制删除untracked的文件
可以用来删除新建的文件。如果不指定文件文件名,则清空所有工作的untracked文件。clean命令,注意两点:
clean后,删除的文件无法找回
不会影响tracked的文件的改动,只会删除untracked的文件git clean <file-name> -f
强制删除untracked的目录
可以用来删除新建的目录,注意:这个命令也可以用来删除untracked的文件。详情见上一条
git clean <directory-name> -df

展示简化的commit历史
git log --pretty=oneline --graph --decorate --all
把某一个分支到导出成一个文件
git bundle create <file> <branch-name>
从包中导入分支
新建一个分支,分支内容就是上面git bundle create命令导出的内容
git clone repo.bundle <repo-dir> -b <branch-name>
执行rebase之前自动stash
git rebase --autostash
从远程仓库根据ID,拉下某一状态,到本地分支
git fetch origin pull/<id>/head:<branch-name>
详细展示一行中的修改
git diff --word-diff
清除gitignore文件中记录的文件
git clean -X -f
展示所有alias和configs
注意: config分为:当前目录(local)和全局(golbal)的config,默认为当前目录的config
git config --local --list (当前目录)
git config --global --list (全局)
展示忽略的文件
git status --ignored
commit历史中显示Branch1有的,但是Branch2没有commit
git log Branch1 ^Branch2
在commit log中显示GPG签名
git log --show-signature
删除全局设置
git config --global --unset <entry-name>
新建并切换到新分支上,同时这个分支没有任何commit
相当于保存修改,但是重写commit历史
git checkout --orphan <branch-name>
展示任意分支某一文件的内容
git show <branch-name>:<file-name>
clone下来指定的单一分支
git clone -b <branch-name> --single-branch https://github.com/user/repo.git
忽略某个文件的改动
关闭 track 指定文件的改动,也就是 Git 将不会在记录这个文件的改动
git update-index --assume-unchanged path/to/file

恢复 track 指定文件的改动
git update-index --no-assume-unchanged path/to/file

忽略文件的权限变化
不再将文件的权限变化视作改动
git config core.fileMode false
展示本地所有的分支的commit
最新的放在最上面
git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/
在commit log中查找相关内容
通过grep查找,given-text:所需要查找的字段
git log --all --grep='<given-text>'
把暂存区的指定file放到工作区中
git reset <file-name>

强制推送
git push -f <remote-name> <branch-name>列出所有远程分支
-r参数相当于:remote
git branch -r

更新到本地
# 源 + 分支名
git pull origin master

初始化本地git仓库(创建新仓库)

git init                                               
# 初始化 git 项目
git init
安装好 Git 之后,配置你的资料:
# 配置用户名
git config --global user.name "Your Real Name"
# 配置邮箱地址
git config --global user.email [email protected]

配置用户名

git config --global user.name "xxx"                       

配置邮件

git config --global user.email "[email protected]"              

git status等命令自动着色

git config --global color.ui true                         
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto

clone远程仓库

git clone git+ssh://[email protected]/VT.git             

查看当前版本状态(是否修改)

git status                                                

添加xyz文件至index

git add xyz                                               

增加当前子目录下所有更改过的文件至index

git add .                                                 

提交

git commit -m 'xxx'                                       

合并上一次提交(用于反复修改)

git commit --amend -m 'xxx'                               

将add和commit合为一步

git commit -am 'xxx'                                      

删除index中的文件

git rm xxx                                                

递归删除

git rm -r *                                               

显示提交日志

git log                                                   

显示1行日志 -n为n行

git log -1                                                

git log -5

显示提交日志及相关变动文件

git log --stat                                            

git log -p -m

显示某个提交的详细内容

git show dfb02e6e4f2f7b573337763e5c0013802e392818         

可只用commitid的前几位

git show dfb02                                            

显示HEAD提交日志

git show HEAD                                             

显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本

git show HEAD^                                            

显示已存在的tag

git tag                                                   

增加v2.0的tag

git tag -a v2.0 -m 'xxx'                                  

显示v2.0的日志及详细内容

git show v2.0                                             

显示v2.0的日志

git log v2.0                                              

显示所有未添加至index的变更

git diff                                                  

显示所有已添加index但还未commit的变更

git diff --cached                                         

比较与上一个版本的差异

git diff HEAD^                                            

比较与HEAD版本lib目录的差异

git diff HEAD -- ./lib                                    

比较远程分支master上有本地分支master上没有的

git diff origin/master..master                            

只显示差异的文件,不显示具体内容

git diff origin/master..master --stat                     

增加远程定义(用于push/pull/fetch)

git remote add origin git+ssh://[email protected]/VT.git 

显示本地分支

git branch                                                

显示包含提交50089的分支

git branch --contains 50089                               

显示所有分支

git branch -a                                             

显示所有原创分支

git branch -r                                             

显示所有已合并到当前分支的分支

git branch --merged                                       

显示所有未合并到当前分支的分支

git branch --no-merged                                    

本地分支改名

git branch -m master master_copy                          

从当前分支创建新分支master_copy并检出

git checkout -b master_copy                               

上面的完整版

git checkout -b master master_copy                        

检出已存在的features/performance分支

git checkout features/performance                         

检出远程分支hotfixes/BJVEP933并创建本地跟踪分支

git checkout --track hotfixes/BJVEP933                    

检出版本v2.0

git checkout v2.0                                         

从远程分支develop创建新本地分支devel并检出

git checkout -b devel origin/develop                      

检出head版本的README文件(可用于修改错误回退)

git checkout -- README                                    

合并远程master分支至当前分支

git merge origin/master                                   

合并提交ff44785404a8e的修改

git cherry-pick ff44785404a8e                             

将当前分支push到远程master分支

git push origin master                                    

删除远程仓库的hotfixes/BJVEP933分支

git push origin :hotfixes/BJVEP933                        

把所有tag推送到远程仓库

git push --tags                                           

获取所有远程分支(不更新本地分支,另需merge)

git fetch                                                 

获取所有原创分支并清除服务器上已删掉的分支

git fetch --prune                                         

获取远程分支master并merge到当前分支

git pull origin master                                    

重命名文件README为README2

git mv README README2                                     

将当前版本重置为HEAD(通常用于merge失败回退)

git reset --hard HEAD                                     

git rebase

删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)

git branch -d hotfixes/BJVEP933                           

强制删除分支hotfixes/BJVEP933

git branch -D hotfixes/BJVEP933                           

列出git index包含的文件

git ls-files                                              

图示当前分支历史

git show-branch                                           

图示所有分支历史

git show-branch --all                                     

显示提交历史对应的文件修改

git whatchanged                                           

撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818

git revert dfb02e6e4f2f7b573337763e5c0013802e392818       

内部命令:显示某个git对象

git ls-tree HEAD                                          

内部命令:显示某个ref对于的SHA1 HASH

git rev-parse v2.0                                        

显示所有提交,包括孤立节点

git reflog                                                

git show HEAD@{5}

显示master分支昨天的状态

git show master@{yesterday}                               

图示提交日志

git log --pretty=format:'%h %s' --graph                   
git show HEAD~3
git show -s --pretty=raw 2be7fcb476

暂存当前修改,将所有至为HEAD状态

git stash                                                 

查看所有暂存

git stash list                                            

参考第一次暂存

git stash show -p stash@{0}                               

应用第一次暂存

git stash apply stash@{0}                                 

文件中搜索文本“delete from”

git grep "delete from"                                    
git grep -e '#define' --and -e SORT_DIRENT

git gc
git fsck
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant