16.git使用总结

1、下载资源

软件:Git-2.10.0-64-bit.exe(win64)

学习资料:https://git_scm.com/book/zh/vz

    https://git_scm.com/book/en/vz

2、your ID

$ git config --global user.name "sheng"

$ git config --global user.email shengxxxx@163.com

3、基本指令

$ git init 创建本地仓库

$ git add *.c *.h 跟踪指定对象

$ git add README 建立跟踪文件名README

$ git commit -m 'inital project version'   提交更新并注释

$ git commit -m 'log' -a提交更新并注释 -a:add

$ git atatus 查看已被跟踪文件状态

4、应用指令

$ git diff -staged比较当前文件和暂存区域之间的差异

$ rm README 移除文件

$ git rm README 记录移除文件操作

$ git rm --cache README 保留文件在磁盘,但不想让git继续跟踪

$ git mv file_old file_new修改跟踪文件名

$ git reset HEAD README取消暂存的文件

$ git checkout --README 撤销对文件的修改

5、查看提交历史

$ git log 查看提交的历史

$ git log -p -2 -p:显示每次提交内容的差异 -2:显示最近两次提交

$ git log --stat 查看每次提交的简略的统计信息

6、删除仓库

$ find . -name ".git" | xargs rm -Rf

7、忽略不需要跟踪文件

-1、建立:$ vim .gitignore

建立 .gitignore文件,打开文件,填入下述语法

如需忽略文件:*.o    *.d   *.cppxxxx.*

如需忽略文件夹:test/*

-2、配置语法:


   以斜杠“/”开头表示目录;

   以星号“*”通配多个字符;

   以问号“?”通配单个字符

   以方括号“[]”包含单个字符的匹配列表;

   以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;

   此外,git 对于 .ignore 配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

-3、示例:


   (1)规则:fd1/*
      说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;

   (2)规则:/fd1/*
       说明:忽略根目录下的 /fd1/ 目录的全部内容;
   (3)规则:
/*
!.gitignore
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;

8、远程仓库

(1)添加远程仓库

$ git remote

$ git remote add test https://github.com/paul/ticgit   //test指代URL

$ git remote -v

$ git fetch test  //拉取远程仓库中有,而你没有的信息

$ git push origin master//推送到远程仓库

$ git remote show origin  //查看远程仓库信息

(2)远程仓库移除与重命名

$ git remote rename test paultest更名为paul

$ git remote rm paul 移除该镜像

(3)克隆现有仓库

$ git clone https://github.com/libgit2/libgit2

9、创建分支

$ git branch testing//创建 但HEAD还在master

$ git checkout testing//切换到testing分支

$ git checkout master//切换到master

10、删除已跟踪文件

如果文件已经被跟踪且被推送到远程,可以按照下面方法解决:

  1. rm -rf 文件
  2. git rm -r --cached 要忽略的文件
  3. git add -A (添加所有)
  4. git push origin 分支

如果同名的文件过多,如:.class 文件被提交了,那么如果这样一个一个显然效率太低,可以按照下面方法操作

  1. find . -iname 文件名 -exec rm -rf {}\;
  2. 重复上面的步骤,文件名替换为下一个要删除的文件名
  3. 修改gitignore,添加忽略文件
  4. git rm -r --cached 要忽略的文件
  5. git add -A
  6. git push origin 分支

---------------------------------------------------------------------------------------------------

git使用实例记录

-------------------------------------------------------------------------------

1、修改文件的提交(转)

比如你在仓库目录下的其中一个文件夹file1中修改了一个.C文件

$ git add file1          //路径注意不要add错了,必须是当前.git可见的路径,在此时的bash下只可见file1,不可见.c文件。

$ git commit -m 'your commit'

这样就完成修改和提交工作了。

查看各提交历史:

$ git log --pretty=oneline  //会出现各提交记录版本号以及你的commit

2、版本回退

参:http://blog.youkuaiyun.com/zhang31jian/article/details/40982161

回退到上一个版本号显示:

$ git log --pretty=oneline

$ git log --pretty=oneline            //1
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

现在,我们要把当前版本“append GPL”回退到上一个版本“add distributed”,就可以使用git reset命令:

$ git reset --hard HEAD^              //2  回退到前一个版本
HEAD is now at ea34578 add distributed
在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

$ git reset --hard 3628164           //3   回退到指定版本
HEAD is now at 3628164 append GPL

版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

现在总结一下:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。      //4  找出回退的版本号,以便吃后悔药

3、分支管理

(1)、建立分支

$ git branch dev

(2)、查看分支

$ git branch -a     // 此时HEAD指针仍指向master

(3)、切换并创建新分支

$ git checkout -b dev   //git checkout命令加上-b参数表示创建并切换分支上

(4)、查看切换的分支

$ git branch -a

git branch -a 命令可以查看所有分支,现在我们HEAD指针便指向dev分支,大家可以在上图中看到dev分支上有个*号。

(5)、切换到master

$ git checkout master      //cat test.txt  显示test.txt中的内容

(6)、合并分支

$ git merge dev //合并dev分支修改内容到master主干上,注:操作的HEAD指针先指向master

(7)、删除分支

$ git branch -d dev //删除dev分支

查看一下:git branch -a  发现只有master这一个主分支了。

(8)、总结指令

  • 查看分支 git branch -a
  • 创建分支 git branch name
  • 切换分支 git checkout name
  • 创建并切换 git checkout -b name
  • 合并某分支到当前分支 git merge name
  • 删除分支 git branch -d name

后再提交。

(9)、分支合并冲突

Git告诉我们readme.txt文件存在冲突,必须手动解决冲突后再提交。

用到的指令:

创建分支并修改内容

$ git checkout -b dev1  //切换并创建分支dev1   以下在dev1分支上

$ vim test.txt  //创建文本并编辑

$ cat test.txt   //查看文本内容

$ git add test.txt   //添加到git

$ git commit -m 'add test.txt'  //提交

切换到master合并分支test.txt

$ git checkout master

同上建立一个test.txt文档并添加内容

$ git merge dev1   

合并失败,手动修改后合并

删除dev1分支

$ git branch -d dev1

用 git log --graph --pretty=oneline --abbrev-commit 命令,查看一下分支合并

(10)、分支与分支合并

$ git merge --no--ff -m "test" dev //合并dev

--no-ff参数表示禁用快速合并

下面我们来说一下一般企业中开发一个项目的分支策略:分支命名

  • 主分支 master   
  • 开发分支 develop   
  • 功能分支 feature
  • 预发布分支  release
  • bug 分支 fixbug
  • 其它分支 other

4、开发协作(远程仓库)

------------参:http://www.oschina.net/question/31384_157479

(1)、查看远程仓库

$ git remote    //查看远程仓库

$ git remote  -v  //加-v选项可以查看详细信息

(2)、分支推送

$ git push origin master   //本地master分支与远程的master分支已同步

$ git push origin dev        //同步dev分支

本地有很多分支,有哪些分支需要推送到远程仓库中呢?一般是这样的,

  • master 分支是主分支,要时刻与远程同步,一般我们发布最新版本就用master分支
  • develop 分支是开发分支,团队中所有人都在这个分支上开发,所以也需要与远程同步
  • bug 分支一般只在本地使用来修复bug,一般不需推送远程仓库中
  • feature 分支是否需要推送到远程,要看是不是有几个人合作开发新功能,如果你是一个开发,那就留在本地吧
  • release 分支一般是系统管理,推送或抓取的分支一般与开发人员无关
  • other 分支大家按需求分配

(3)、本地分支与远程分支进行链接

$ git  branch --set--upstream dev  origin/dev //将dev分支与远程origin/dev分支进行链接

$ git push     //git pull 成功,但是合并有冲突需要手动解决,解决的方法和分支管理中的解决冲突完全一样。

总结:

多人开发模式:

1)试图用git push origin branch-name推送自己的修改如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并如果合并有冲突,则解决冲突,并在本地提交没有冲突或者解决掉冲突后。

2)再用git push origin branch-name推送就能成功如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

5、远程操作 

参:http://www.ruanyifeng.com/blog/2014/06/git_remote.html

1)列出远程主机

$ git remote  

$ git remote   -v  //-v参考远程主机网址

克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。

$ git clone -o [your name] https://xxxxxxxxx

2)远程操作基本指令

git remote show命令加上主机名,可以查看该主机的详细信息。

$ git remote show <主机名>

git remote add命令用于添加远程主机。

$ git remote add <主机名> <网址>

git remote rm命令用于删除远程主机。

$ git remote rm <主机名>

git remote rename命令用于远程主机的改名。

$ git remote rename <原主机名> <新主机名>

3) git fetch

将远程主机的更新全部取回本地,查看其他人的进程,对本地的开发代码没有影响。

--1)取回资源

默认取回所有分支代码,可以指定取回:

$ git fetch <远程主机名(origin)>  <分支名(master)>

$ git branch -r  //查看远程分支

$ git branch -a //查看所有分支

--2)建立分支

直接创建远程分支:

$ git checkout -bnewbranch origin/master    //origin/master的基础上,创建一个新分支

在本地创建合并到远程分支:

$ git merge origin/master   //在当前分支上,合并origin/master

4) git pull

取回远程主机某个分支的更新,再与本地指定某个分支合并。

--1)基本合并指令

$ git pull <远程主机名> <远程分支名>:<本地分支名>
举例:$ git pull origin next:master //取回origin主机的next分支,并与本地的master合并
$ git pull origin next //如果远程分支是当前分支合并,则冒号后面的部分也可以省略
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。

--2)建立本地与远程追踪关系

自动建立追踪:
在某种场合下git会自动建立本地与远程代码之间的追踪关系,比如git clone的时候所有本地分支默认与远程主机的同名分支建立一种追踪关系。
手动建立追踪:
$ git branch --set-upstream master origin/next 
//上面命令指定master分支追踪origin/next分支。

如果当前分支与远程分支存在追踪关系,git pull可以省略远程分支名:

$ git pull origin  //本地的当前分支自动与对应的远程origin主机追踪分支进行合并。

$ git pull   //如果当前分支只有一个追踪分支,那么远程主机名(origin)也可以省略

--3)删除不存在远程对应分支的本地分支

        如果远程主机删除了某个分支,默认情况下,git pull不会在拉取远程分支的时候,删除对应的本地分支。

如果要删除不存在远程对应分支的本地分支,可以用以下指令:

$ git pull -p

#等同于下面命令:

$ git fetch --prune origin

$ git fetch -p

5)git push

将本地分支的更新推送到远程。

$ git push <远程主机名> <本地分支名>:<远程分支名>

举例:

---1、如果省略远程分支名,表示本地分支推送与之存在追踪关系的远程分支,如果远程分支不存在,则会被新建。

$ git push origin master  //将本地的master分支推送到远程主机,若远程主机分支不存在,则会新建。

---2、如果省略本地分支名,则会删除指定的远程分支,因为等同于推送一个空的本地分支到远程分支。

$ git push origin  :master   

#the same

$ git push origin --delete master  //删除远程主机的master分支

---3、如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略。

$ git push origin   //将当前分支推送到origin主机的对应分支

---4、如果分支只有一个分支,那么主机名也可以省

$ git push

---5、如果本地分支与多个主机存在追踪关系。

$ git push -u origin master

---6、不管是否存在远程分支,将本地的所有分支都推送到远程主机。

$ git push --all origin

---7、如果远程主机的版本比本地版本更新,push会报错,可以强制推送。

$ git push --force origin


<think>好的,用户现在遇到了Git推送时的错误,之前已经提供过解决方案,现在用户提供了具体的日志信息,需要进一步分析。首先,用户执行了带有详细日志的命令`GIT_TRACE=1 GIT_CURL_VERBOSE=1 git push -v origin master`,输出了错误信息,显示内部错误,无法读取远程仓库,提示检查权限和仓库是否存在。 首先,我需要分析用户提供的日志。日志中显示使用的是SSH协议,尝试连接到`git@192.168.40.190`,并执行`git-receive-pack`命令。错误是“Gogs: Internal error”,然后是常见的权限或仓库存在的提示。这可能意味着SSH连接成功,但服务器端处理请求时出错。 接下来,按照之前的解决方案框架,我需要逐步排查可能的因素。首先,检查远程地址是否正确。用户使用的是`192.168.40.190:wufanfan/MVS2ITEK.git`,看起来是SSH格式,但正确的SSH格式应该是`git@192.168.40.190:wufanfan/MVS2ITEK.git`。不过用户的日志中显示命令已经正确使用了`git@192.168.40.190`,所以地址可能没问题。 接下来检查SSH密钥。用户能够发起连接,说明SSH配置可能正确,但需要确认公钥是否添加到Gogs账户,并且权限正确。可能需要用户检查`~/.ssh/id_rsa.pub`是否在Gogs的SSH设置中,并确认文件权限是否为600。 然后,检查仓库是否存在。用户需要访问`http://192.168.40.190/wufanfan/MVS2ITEK`确认仓库是否存在。如果不存在,需要创建。此外,可能服务器端仓库权限问题,比如Gogs服务账户是否有权访问该仓库目录,或者目录权限是否正确。 另外,查看日志中的Gogs内部错误,可能需要检查服务器端日志。用户可能需要联系管理员查看Gogs的日志文件,通常在`/var/log/gogs/gogs.log`,寻找更具体的错误信息。 网络问题方面,用户已经能连接到服务器,所以可能不是网络问题,但可以建议检查防火墙或SSH端口是否开放。不过日志显示连接已建立,因此问题更可能出在服务器端处理请求时。 总结下来,可能的解决步骤包括:确认仓库存在,检查SSH密钥配置,检查服务器端权限和日志。需要将这些步骤清晰地传达给用户,并建议他们逐步排查,特别是检查仓库是否存在和服务器日志。</think>以下是针对你提供的错误日志的详细分析及解决方案: --- ### **错误日志关键信息解读** ```bash Pushing to 192.168.40.190:wufanfan/MVS2ITEK.git trace: run_command: ssh git@192.168.40.190 'git-receive-pack '\''wufanfan/MVS2ITEK.git'\''' Gogs: Internal error fatal: Could not read from remote repository. ``` - **关键点1**:使用 SSH 协议推送至 `192.168.40.190:wufanfan/MVS2ITEK.git` - **关键点2**:已建立 SSH 连接,但服务器返回 `Gogs: Internal error` - **核心问题**:SSH 连接成功,但 Gogs 服务端处理请求失败(可能是仓库权限、服务端配置或仓库路径问题)。 --- ### **分步解决方案** #### **1. 确认仓库路径是否存在** - **访问 Gogs 网页端** 浏览器直接打开仓库 URL: ``` http://192.168.40.190/wufanfan/MVS2ITEK ``` - 若显示 `404`,说明仓库不存在 → 需在 Gogs 网页端手动创建同名仓库 - 若仓库存在,检查仓库路径大小写是否一致(Gogs 区分大小写)。 #### **2. 验证 SSH 密钥权限** - **检查公钥是否绑定到 Gogs 账户** 1. 打开本地公钥文件: ```bash cat ~/.ssh/id_rsa.pub ``` 2. 登录 Gogs 网页端 → **用户设置** → **SSH 密钥** → 确认公钥已添加。 - **检查私钥文件权限** 运行以下命令修复权限: ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa ``` #### **3. 手动测试 SSH 连接** ```bash ssh -Tv git@192.168.40.190 ``` - **预期成功输出**: ``` Hi wufanfan! You've successfully authenticated. ``` - **若失败**: - 检查 SSH 服务是否在 `192.168.40.190` 运行(默认端口 22): ```bash telnet 192.168.40.190 22 ``` #### **4. 检查 Gogs 服务端仓库权限** - **登录服务器检查仓库目录** 仓库路径通常为: ```bash /home/git/gogs-repositories/wufanfan/MVS2ITEK.git ``` 1. 确认目录存在: ```bash ls -l /home/git/gogs-repositories/wufanfan/MVS2ITEK.git ``` 2. 修复权限(Gogs 默认用户为 `git`): ```bash chown -R git:git /home/git/gogs-repositories/wufanfan chmod -R 750 /home/git/gogs-repositories/wufanfan ``` #### **5. 查看 Gogs 服务端日志** - **登录服务器查看日志** 默认日志路径: ```bash tail -f /var/log/gogs/gogs.log ``` - **常见错误**: - `Repository does not exist` → 仓库路径错误 - `Permission denied` → 文件系统权限问题 - `Failed to execute git command` → Git 版本不兼容 #### **6. 尝试使用 HTTP 协议临时测试** ```bash git remote set-url origin http://192.168.40.190/wufanfan/MVS2ITEK.git git push -u origin master ``` - 若 HTTP 协议成功,说明 SSH 配置有问题; - 若 HTTP 同样失败,说明服务端仓库或权限问题。 --- ### **附:快速检查脚本** ```bash # 1. 检查仓库是否存在 curl -I http://192.168.40.190/wufanfan/MVS2ITEK # 2. 检查 SSH 连接 ssh -T git@192.168.40.190 # 3. 检查本地仓库配置 git remote -v cat .git/config ``` --- ### **总结** - **若仓库存在且权限正确** → 联系管理员检查 Gogs 服务端日志; - **若仓库不存在** → 在 Gogs 网页端手动创建; - **若 SSH 密钥错误** → 重新生成并绑定密钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风浅醉

点起你的小虹心

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值