git的基本使用及常见问题

  • 创建git仓库
  • 登录github,点击右上角头像,选择Your repositories .
  • 点击New,输入Repositories name ,输入Description,勾选Initialize this repository with a README。
  • 点击Create repository

创建完成后,我们就得到了仓库的https以及SSH的地址:
https地址:https://github.com/用户名/仓库名.git
SSH地址:[email protected]:用户名/仓库名.git

  • 安装git
  • windows访问https://gitforwindows.org下载安装包

其他系统安装git可查看官方文档:https://git-scm.com/book/en/v2/Getting-Started-Installing-Git
安装完成后即可使用git-bash

  • 创建ssh key
  • git-bash 中执行:ssh-keygen -t rsa -C “github注册邮箱”,后面的操作默认回车。

执行完之后,会在User文件夹的用户下创建.ssh文件夹,其中有一个id_rsa.pub文件,复制其中的key

  • 返回github,进入Account Settings,选择左边的SSH and GPG Keys选项,输入刚刚生成的key
  • 验证是否绑定本地成功:ssh -T [email protected]
  • 初次运行配置
  • 设置用户名和邮箱

设置用户名:git config --global user.name “用户名”
设置邮箱:git config --global user.email “github邮箱”
检查配置:git config --list

  • 代码提交
  • 初始化项目:git init

git init会在当前目录下创建隐藏的.git文件夹,使目录变为git可以管理的仓库

  • 跟踪新文件:git add fileName

fileName 可使用通配符.

  • 提交代码到本地仓库:git commit -m “提交说明”
  • 关联远程仓库:git remote add origin [email protected]:用户名/仓库名.git
  • 提交到远程仓库:git push -u origin master
  • 使用技巧
  • git commit -amend < fileName >

取消已经commit但并未push到远程仓库的文件

  • git status

查看文件状态

  • git checkout – < fileName >

撤销之前对< fileName >文件的修改,除非你非常确认,否则不要轻易使用这个命令,使用该命令后,之前对该文件的修改将全部移除。

  • git remote

列出已配置的远程服务器

  • git remote add < shortname> < url>

添加远程仓库,< shortname> 是< url>的简写

  • git commit 后撤销

执行git reset --soft HEAD^
HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
参数解释:
–mixed :不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
–soft :不删除工作空间改动代码,撤销commit,不撤销git add .
–hard :删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。

  • git merge

代码合并

  • git log

查看提交历史

  • 错误处理
  • git push 报错

git remote -v 检查配置
git remote rm < shortname> 移除错误配置
git remote add origin [email protected]:用户名/仓库名.git 重新关联远程仓库
第一次提交到远程仓库,需要添加-u参数
错误信息:failed to push some refs to ‘http://xxxxxx/xxx.git’
解决方案:1.git pull origin master 2.git push origin master

  • git pull 报错

错误信息:fatal: refusing to merge unrelated histories
问题原因:其实这个问题是因为 两个 根本不相干的 git 库 其实这个问题是因为 两个 根本不相干的 git 库
方案1:从远端库拉下来代码 , 本地要加入的代码放到远端库下载到本地的库, 然后提交上去 , 因为这样的话, 你基于的库就是远端的库, 这是一次update了
方案2:git pull origin master --allow-unrelated-histories 后面加上 --allow-unrelated-histories , 把两段不相干的 分支进行强行合并

  • git pull报错

错误信息:failed to push some refs to
问题原因:这个问题是因为远程库与本地库不一致造成的,那么我们把远程库同步到本地库就可以了。
解决方案:git pull --rebase origin master
这条指令的意思是把远程库中的更新合并到本地库中,–rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中。
之后重新执行commit命令及push命令即可
git push origin master -u

  • git pull报错

错误信息:Your local changes to the following files would be overwritten by merge…Please, commit your changes or stash them before you can merge.
问题原因:这种情况大多是由于修改了文件,然后没有进行及时的提交代码到远程仓库中造成的冲突,工作中经常发生这种冲突。
方案1:保留本地的修改 的改法
git stash
git pull
git stash pop
方案2:放弃本地修改 的改法
git reset --hard
git pull

通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git >pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一>致。同时,将当前的工作区内容保存到Git栈中。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

  • 切换分支报错

错误描述:The following untracked working tree files would be overwritten by checkout
问题原因:通过错误提示可知,是由于一些untracked working tree files引起的问题。所以只要解决了
这些untracked的文件就能解决这个问题。
解决方案:直接执行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基础知识

1.Git基础

1.1. 在工作目录中初始化新仓库

git init

1.2. 将文件纳入版本控制

git add .
git commit -m 'description'

1.3. 从现有仓库中克隆

git clone [resp_url]

1.4. 检查文件状态

git status

1.5. 创建.gitimnore文件

cat .gitignore

1.6. 查看差异

 //查看已暂存的文件和上次提交时的差异 
git diff --cached 
git diff --staged  //高版本使用

1.7. 提交更新

git commit
git commit -a //跳过git add直接提交所有已跟踪过的文件

1.8. 移除文件

git rm [file_name]
git rm -f  //强制删除
git rm --cached  //移除文件跟踪,但不删除文件

1.9. 移动文件

git mv file_from file_to 

1.10. 查看提交历史

git log
git log -p //显示每次提交的内容差异
git log -p -2  //显示最近的两次更新
git log 常用选项 说明
-p 按补丁格式显示每个更新之间的差异
–word-diff 按 word diff 格式显示差异
–stat 显示每次更新的文件修改统计信息
–shortstat 只显示 --stat 中最后的行数修改添加移除统计。
–name-only 仅在提交信息后显示已修改的文件清单
–name-status 显示新增、修改、删除的文件清单
–abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符
–relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)
–graph 显示 ASCII 图形表示的分支合并历史
–pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)
–oneline –pretty=oneline --abbrev-commit 的简化用法
-(n) 仅显示最近的 n 条提交
–since, --after 仅显示指定时间之后的提交
–until, --before 仅显示指定时间之前的提交
–author 仅显示指定作者相关的提交
–committer 仅显示指定提交者相关的提交
format选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明

format //git log --pretty= format:"%h - %an, %ar : %s"
1.11. 撤销操作

git commit --amend  //撤销刚刚的commit操作
git reset HEAD  //撤销刚刚的add操作
git checkout --   //撤销对文件的修改

1.12. 远程仓库的使用

git remote  //查看当前远程仓库
git remote -v //显示克隆地址
git remote add [shortname] [url] //添加远程仓库
git fetch [remote-name]  //从远程仓库抓取数据
git push [remote-name] [branch-name]  //推送数据到远程仓库
git remote show [remote-name]  //查看远程仓库信息
git remote rename [name] [name] //修改某个远程仓库在本地的简称 
git remote rm  //移除远程仓库

1.13. 打标签

git tag  //列出所有标签
git tag -a [tag-name] -m 'description' //创建标签
git tag -s [tag-name] -m 'description'  //签署标签
git tag [tag-name] //创建轻量级标签
git tag -v [tag-name] //验证标签

1.14. 设置别名

git config --global alias.co checkout //设置checkout的别名为co

1.15. 分支

git branch [branch-name] //创建分支
git checkout [branch-name] //切换分支
git checkout -b [branch-name] //新建并切换到分支
git branch -d [branch-name] //删除分支
git merge [branch-name] //合并分支
git branch -v  //查看各个分支最后一个提交对象的信息 
git branch --merged //查看哪些分支已被并入当前分支 
git branch --no-merged  //查看尚未合并的工作 

1.16. 远程分支

git push (远程仓库名) (分支名) //推送本地分支
git push [远程名] :[分支名]  //删除远程分支

1.17. 配置git

git config --help  //选项列表 
git config --global ore.editor  //改变默认编辑器 


1.18. 配置mergetool和difftool

git difftool --tool-help //查看当前支持的difftool
git mergetool --tool-help //查看当前支持的mergetool 
git config --global merge.tool beyond //配置mergetool
git config --global mergetool.beyond.cmd \
    'extMerge "$BASE" "$LOCAL" "$REMOTE" "$MERGED"'  //配置mergetool 路径
git config --global mergetool.trustExitCode false //通知 Git 程序的退出是否指示合并操作成功 
git config --global diff.external  //通知 Git 用什么命令做比较 

例如配置beyond compare

//difftool 
git config --global diff.tool bc4
git config --global difftool.bc4.path "bcomp.exe的路径" 
//mergetool 
git config --global merge.tool bc4
git config --global mergetool.bc4.path "bcomp.exe的路径" 

这里要注意的是:“bcomp.exe的路径"这个东西不是"BCompare.exe”,而是"bcomp.exe"

如果出现虽然安装了bc但mergetool不可用的情况,可以通过修改用户目录下的 gitconfig追加difftool和mergetool的配置

[diff]
	tool = bc
[difftool "bc"]
	cmd = \"D:/Program Files/Beyond Compare 4/BComp.exe\" \"$LOCAL\" \"$REMOTE\"
[merge]
	tool = bc
[mergetool "bc"]
	cmd = \"D:/Program Files/Beyond Compare 4/BComp.exe\" \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\" 

windows下配置

git config --global diff.tool bc4
git config --global difftool.prompt false
git config --global difftool.bc4.cmd '"D:\Program Files\Beyond Compare 4\BCompare.exe" "$LOCAL" "$REMOTE"'

git config --global merge.tool bc4
git config --global mergetool.prompt false
git config --global mergetool.bc4.cmd '"D:\Program Files\Beyond Compare 4\BCompare.exe" "$LOCAL" "$REMOTE" "$BASE" "$MERGED"'
git config --global mergetool.bc4.trustexitcode true

常用场景

  • 强制更新远程仓库代码,覆盖本地
    git fetch --all
    git reset --hard master 
    git pull   #可省略 
    
  • 对比本地与远程仓库的差异
    //1.更新本地文件的远程分支
    git fetch origin
    
    //2.本地与远程的差集 :(显示远程有而本地没有的commit信息)
    git log master..origin/master
    
    //3.统计文件的改动
    git diff --stat master origin/master
    
  • 本地检出一个新的分支并推送到远程仓库
     //1.创建本地分支
     git checkout -b 新分支名
     //2.推送本地分支到远程仓库
     git push --set-upstream origin 分支名 
    
  • 将远程git仓库里的指定分支拉取到本地(本地不存在的分支)
     git checkout -b 本地分支名 origin/远程分支名
     若不成功则执行 git fetch 后重复上述操作
    
  • git查看提交记录
     git log 查看所有的commit提交记录
     git show 查看提交的详情
     1.查看最新的commit
     git show
     2.查看指定commit hashID的所有修改:
     git show commitId
     3.查看某次commit中具体某个文件的修改:
     git show commitId fileName
    
  • 常用git stash命令
    git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。
    
    git stash list  :查看stash了哪些存储
    
    git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
    
    git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p
    
    git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} 
    
    git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop   stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
    
    git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
    
    git stash clear :删除所有缓存的stash
    
    • git stash
    git stash list  // 查看stash列表
    
    1、添加改动到stash
    git stash save "messeag"
    git stash save -m "messeag"
    git stash save -u "messeag"
    git stash save -a "messeag"
    -a表示all,是不仅仅把新加入的代码文件放入暂存区,还会把用.gitignore忽略的文件放入暂存区。如果想不影响被忽略的文件,那就要用-u,表示untracked files。
    
    2、恢复改动
    git stash list查看stash列表,从中选择你想要pop的stash,运行命令
    git stash pop stash@{id}
    或者 
    git stash apply stash@{id} 即可
    
    3、删除stash
    git stash drop  如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。
    git stash clear 是清除所有stash
    
    4、git stash pop 与 git stash apply  的区别。
    git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除,而 git stash apply   stash@{id} 命令则会继续保存stash id
    
    5. 查看指定stash的diff
    git stash show
    git stash show stash@{id}
    
    补充:
    
    注:[]方括号中内容为可选,[]里面的stash代表进度的编号形如:stash@{0}, <>尖括号内的必填
    
    git stash 对当前的暂存区和工作区状态进行保存。 
    git stash list 列出所有保存的进度列表。
    
    git stash pop [--index] [] 恢复工作进度
    git stash apply [--index] [] 不删除已恢复的进度,其他同git stash pop
    
    git stash drop [] 删除某一个进度,默认删除最新进度 
    git stash clear 删除所有进度
    
    git stash branch   基于进度创建分支
    
    补充:
    查看git stash保存的时间
    git stash list --date=relative
    git stash list --date=short
    git stash list --date=local
    git stash list --pretty=format:"%C(red)%h%C(reset) - %C(dim yellow)(%C(bold magenta)%gd%C(dim yellow))%C(reset) %<(70,trunc)%s %C(green)(%cr) %C(bold blue)<%an>%C(reset)"
    
  • git生成patch和打入patch
    • git format-patch
      git format-patch HEAD^     #生成最近的1次commit的patch
      
      git format-patch HEAD^^    #生成最近的2次commit的patch
      
      git format-patch HEAD^^^     #生成最近的3次commit的patch
      
      git format-patch HEAD^^^^      #生成最近的4次commit的patch
      
      git format-patch ..     #生成两个commit间的修改的patch(包含两个commit. 都是具体的commit号)
      
      git format-patch -1      #生成单个commit的patch
      
      git format-patch      #生成某commit以来的修改patch(不包含该commit)
      
      git format-patch --root     #生成从根到r1提交的所有patch
      
    • git am
      git apply --stat 0001-limit-log-function.patch    # 查看patch的情况
      
      git apply --check 0001-limit-log-function.patch    # 检查patch是否能够打上,如果没有任何输出,则说明无冲突,可以打上(注:git apply是另外一种打patch的命令,其与git am的区别是,git apply并不会将  commit message等打上去,打完patch后需要重新git add和git commit,而git am会直接将patch的所有信息打上去,而且不用重新git add和git commit,author也是patch的author而不是打patch的人)
      
      git am 0001-limit-log-function.patch     # 将名字为0001-limit-log-function.patch的patch打上
      
      git am --signoff 0001-limit-log-function.patch     # 添加-s或者--signoff,还可以把自己的名字添加为signed off by信息,作用是注明打patch的人是谁,因为有时打patch的人并不是patch的作者
      
      git am ~/patch-set/*.patch # 将路径~/patch-set/*.patch 按照先后顺序打上
      
      git am --abort     # 当git am失败时,用以将已经在am过程中打上的patch废弃掉(比如有三个patch,打到第三个patch时有冲突,那么这条命令会把打上的前两个patch丢弃掉,返回没有打patch的状态)
      
      git am --resolved    #当git am失败,解决完冲突后,这条命令会接着打patch
      
      如果打Patch的过程中发生了冲突(conflicts):
      如果不想打这一系列patch了,直接:git am --abort。
      如果还想打:
      (1) 根据git am失败的信息,找到发生冲突的具体patch文件,然后用命令git apply --reject ,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch
      (2) 根据.rej文件,通过编辑该patch文件的方式解决冲突。
      (3) 废弃上一条am命令已经打了的patch:git am --abort
      (4) 重新打patch:git am ~/patch-set/*.patchpatch
      
  • git移除某次commit
    1. git log 查看提交记录
    2. 执行git rebase -i 
    3. 在弹出的界面中将需要删除的commit前面的pick改为drop
    4. 保存
    
  • 更新获取远端分支
    git remote update origin --prune
    
  • git查询本地分支与远端分支的追踪关系
    git branch -vv
    
  • 本地分支与远端分支建立关联关系
    git branch --set-upstream-to=origin/远程分支的名字 本地分支的名字  
    
  • git pull后撤销
      git reflog 查看记录,
      git reset --hard    或者 git reset --hard HEAD@{2}
    
  • 修改远程仓库地址
    //修改命令
    git remote origin set-url [url]
    //先删除,后新增
    git remote rm origin
    git remote add origin [url]
    //直接修改config文件
    

你可能感兴趣的:(web前端,git)