git 从零开始和常见问题

944 阅读4分钟

git下载 git-scm.com/downloads

git的仓库结构

  • 本地仓库 : 用于提交本地代码 是远程代码与本地代码的中转枢纽
    • 工作目录 ------ 也就是我们使用 git init 初始化仓库的地方,在编辑器可直观显示与修改
    • 版本库 ------ 也就是我们用 git init 初始化仓库时生成的 .git 文件夹 版本库相当于一个文件的数据库,记录了文件的历史版本
    • 缓存区 ------ 缓存区介于本地仓库与工作目录之间,用于提交代码和解决冲突
  • 远程仓库 ------ 用于把本地代码存放到服务器

开始使用

配置全局用户名和邮箱

git config --global user.name "username"
git config --global user.email "email"

下拉代码

git clone 你的url  
git pull (可以拉下所有分支,方便查看和关联)

此时git remote -v 可以看到

origin https://... (fetch)
origin  https://... (push)

添加移除origin

//普通添加 
git remote add origin "https://..."
//强制设置
git remote set-url origin "https://..."  
//移除
git remote rm origin

拉取本地不存在的远程分支(同时本地生成分支)

方法1 git checkout -b 本地分支名 origin/远程分支名 (推荐)
方法2 git clone -b 指定的远程分支名 "https://..." 

本地分支关联远程分支

git branch --set-upstream-to=origin/dev dev

查看当前分支与远程分支跟踪关系

git branch -vv

本地生成分支并且添加对应的远程分支

//创建并切换分支
git checkout -b name
//将分支推送到远程仓库
git  push  origin name
//关联远程分支
git branch --set-upstream-to=origin/name name

撤销未提交更改

git checkout -- filename 
git checkout .
git checkout HEAD -- filename (如果删除了某文件想恢复使用这个)

已经提交 版本回退

git log 查看版本号
git reset --hard 版本号

当想用本地某个分支强制覆盖远程另一个分支(master dev举例)

1.切换到dev分支,并保证本地已经同步了远端dev的最新代码。

git checkout dev git pull

2.把本地的dev分支强制推送到远端master

git push origin dev:master -f

3.切换到本地分支master

git checkout master

4.下载远程仓库最新内容,不做合并。

git fetch --all

5.把HEAD指向master最新版本。

git reset --hard origin/master

创建与合并分支等其他常用操作

创建分支:git branch name
切换分支:git checkout name 创建+切换分支:git checkout –b name 合并某分支到当前分支:git merge name 删除分支:git branch –d name 删除远程分支: git push origin --delete name 提交暂存: git add .
提交本地: git commit - m '备注' 推到远程关联分支: git push 更改本地分支名称: git branch -m oldbranchname newbranchname

git 常见问题

执行 git pull 出现 Your configuration specifies to merge with the ref 'refs/heads/xxx' , but no such ref was fetched

出现此问题原因很可能是本地切换分支时候分支名大小出了问题,windows本地不区分大小写,git仓库会区分! 解决办法 : 重命名本地分支比 关联远程对应分支(命令上面有)

执行git pull 出现 error: cannot lock ref 'xxx': ref xxx is at (一个commitID) but expected

问题原因

原因是你这个git工程的.git/refs目录下跟踪的某些git分支,在git pull的时候,与远端的对应分支的refs对比发现不同,所以导致git pull报错。

通常产生这个问题的原因是(以分支git/yousa/feature_01为例):

有人操作git/yousa/feature_01这个分支,在git push的时候使用了git push –force,(当然这个人的git push是push不上去),导致远端分支被覆盖,你本地的refs与远端无法一致,导致问题 git分支是不区分大小写的,如果有人删除掉这个远端分支又重新新建了一个这个分支也会出现同样的问题。

解决办法

根据前面的原因有一些操作方法,基本思路就是要么,强行git pull;要么则是删除掉有问题的refs,再进行git pull(个人还是推荐第二种)(以分支git/yousa/feature_01为例) 删除有问题的refs,可以直接在.git/refs下面根据错误提示删除对应的refs文件,比如这个就是需要删除refs/remotes/origin/git/yousa/feature_01文件(嫌麻烦直接删除整个refs目录也行) 使用git命令删除相应refs文件,git update-ref -d refs/remotes/origin/git/yousa/feature_01 简单粗暴强行git pull,执行git pull -p 另一种思路 error: cannot lock ref 'xxx': ref xxx is at (一个commitID 直观得看错误信息,git本次操作是获取锁失败,git的锁是使用一个共享的文件锁,故删除对应的index.lock文件也可以解决该问题。(直接释放锁)