前言

本文主要记录自己使用Git的经验和使用中遇到问题如何解决。

Git 与 GitHub 常识

参考教程:Progit官方文档

廖雪峰Git教程

小甲鱼Git教程

  • Git是一种分布式版本控制系统,GitHub是它联网托管与他人分享交流的一个平台
  • Git:windows系统中一个普通的文件夹git init以后,变成Git仓库。
  • 可以把这个Git文件夹想象成三个空间:working directory,stage,Git repository。
  • git add 命令添加到stage,git commit -m "message",将文件放入 Git repository 中。
  • Git中的“commit”操作,相当于给当时做了一个快照,我们可以选择回到那个状态。
  • GitHub:把 Git repository 中的文件,通过git push推送到 GitHub repository 中,这样就实现了托管。
  • 当我们想把远端仓库拉回来,使用git pull
  • pull request hi boy ,看我搞出了什么好东西,快来拉取我的仓库合并到你那里呀。

Git的基本操作命令

  • git config --list 或者 git config -l // 查看git配置信息
  • git status // 查看 git repository 基本情况
  • 设置你的身份:name and email

    • git config --global user.name "your name" //设置你的名字,--global代表全局,你也可以对某个指定仓库单独设定用户名和email地址。
    • git config --global user.email "[email protected]" //设置你的 email.
  • git init // 创建一个名为 .git 的子目录,使本目录(directory)成为Git repository。
  • git remote add origin address(url) // 添加远端仓库,与远端仓库建立连接。
  • git push -u origin master // 推送到远端仓库。
  • git remote remove origin // 取消关联的远端仓库。
  • git remote -v // verify,确认当前目录连接的远端仓库是哪一个。
  • git clone + url // 从远端仓库下载到本地,从无到有,区别于git pull。
  • git pull <origin> <master> // 将远端仓库拉取到本地,本地修改后,每次push前先进行git pull操作,保证push到远程仓库时没有版本冲突。
  • git add filename or git add . // 添加特定文件和添加全部文件到stage。
  • git commit -m "descripiton" // 提交到本地仓库(Git repository)并做好备注说明。提交完反悔了怎么办?
  • git push // 将本地仓库(Git repository)推送到远端仓库(GitHub repository)中去。
  • git clean -d -f or git clean -df // 可以删除未被追踪的文件(untracked file)
  • git stash and git pulland git stash dropgit stash list // 可以将冲突的文件进行打包,pull完成后扔掉,相当于作了一次云端覆盖本地的操作。

为 Git 设置代理

HTTP 和 HTTPS代理

git config --list # 查看config配置情况

git config --global http.proxy "socks5://127.0.0.1:7891"

git config --global https.proxy "socks5://127.0.0.1:7891"

设置代理后有一个问题:每次push都需要输入账号密码,贼烦,暂未解决……

取消代理:

git config --global --unset http.proxy

git config --global --unset https.proxy

windows 下 ssh 代理

找到 .ssh 文件夹 新建一个 config 文件,输入:

`Host github.com

ProxyCommand "C:Program FilesGitmingw64binconnect.exe" -S 127.0.0.1:7891 %h %p`

参考:在 windows 上为 git ssh 设置代理

子模块(git submodule)

  • 如果想把blog目录推送到GitHub仓库里,但是blog目录里面的主题目录其实是一个git repository,一个仓库嵌套着一个仓库,这时需要将主题目录设置为submodule
  • 添加子模块的心得

Git 原理解析

git reset and git checkout

  • working directory ——> stage ——> Git directory (version one ; version two ; version three……)
  • git checkout:用于把暂存区域的文件还原到工作目录
  • git reset:把 Git 仓库的文件还原到暂存区域

    • git rest --mixed Head~:1.移动head的指向,将其指向上一个快照。2.将head移动后指向的快照,回滚到暂存区域。
    • git rest --soft Head~:1.移动head的指向,将其指向上一个快照。即撤销一次错误的提交。
    • git rest --hard Head~:1. + 2. + 3. 将暂存区域的文件还原到工作目录。

-

git diff

  • git diff 默认比较工作区域与暂存区域
  • git diff snapshot1ID snapshot2ID 比较两个快照之间的区别
  • git diff snapshot1ID or head 比较工作目录和快照1或者最新的快照之间的区别
  • git diff --cache 比较暂存区和最新快照之间的区别
  • @@ -1 +1,2 @@ 旧文件从第一行开始显示;新文件从第一行开始显示,总共显示两行。

    • - 表示旧文件 + 表示新文件
    • No newline at end of file 需要换行,这样美观
    • :表示世界太大,窗口太小,显示不下了
    • vim 翻页:j 向下移一行 k 向上移一行 f 向前移1页 b 向后移1页 d 向下移半页 u 向上移半页
    • vim 跳转:g 跳转第一行 G 跳转最后一行 3g 移动到前面第3行
    • vim 搜索:? 从下往上搜索 / 从上往下搜索 n 下一个 N 上一个
    • vim 帮助:h 进入帮助文档 q 退出帮助文档

修订、删除、重命名

  • git commit --amend 修订上次的提交
  • git rm filename 只是删除了工作目录和暂存区的记录。

    • git reset -soft head~ 回到过去
  • git mv olderfilename newfilename 将旧文件名改为新的文件名

Git 分支

  1. 创建和切换 Git 分支

    • master 主分支很多人使用,但是你想继续开发新功能,于是切一个branch,开发开发等稳定了,合并到 master 分支去。
    • git branch branchname
    • git checkout -b branchname
  2. 合并和删除分支

    • git log --decorate --all --oneline -graph
    • git merge feature 合并分支
    • git branch -d branchname 删除分支
  3. 匿名分支和checkout命令

Q&A

  1. Q:使用工作电脑push之后,回来另一台电脑pull,会出现untracting的问题,这个是怎么导致的?如何解决这个问题?
  • A:因为同时使用了 onedrive 同步导致产生了冲突,可以使用git clean -d -f来清除这些文件。
  1. Q:本地commit后,于远端仓库出现了同一处的冲突(conflict),比如远端仓库电话号码:6666,本地仓库电话号码:5555 ,如何进行科学的手动合并?能否以远端仓库为主,覆盖掉本地内容,如何操作?
  • A:可以使用git stash将其暂存在栈中,pull完以后,使用git stash drop扔掉,可以使用git stash list来查看暂存栈的文件。
  1. Q:为什么总是有冲突,untracking和overwritten?
  • A:这是因为A仓库里有个B仓库,如果先pullA仓库再pullB仓库,那么B仓库会产生overwritten的问题,需要合并,因为源码已经被A拉取一次了;

如果先拉取B仓库再拉取A仓库,就会出现untracting问题,因为B仓库里产生了新文件而未被A仓库追踪。1.2.3.5问题皆是如此。

出现这种问题,可以暂时使用以上两种手段保证云端覆盖本地。

为避免这种问题,可以使用.gitignore来忽略B仓库文件夹。

想要完全疏通理解这种复杂的关系,需要更精深地学习Git的原理,更多练习实操。

  1. Q:fatal: The current branch master has no upstream branch. 为什么会出现?
  • A:这是因为本地新建了此Git仓库,在连接了远端仓库origin后,未指定分支branch。
  1. Q:error: Your local changes to the following files would be overwritten by merge:……,本地的一下文件将会被git服务器上的内容覆盖。
  • A:如果你想保留本地的修改,则使用暂存命令git stashgit pullgit stash pop。如果想直接覆盖,git reset --hard, git pull origin master
  1. Onedrive的同步逻辑实在是让人搞不明白,虽然比以前强了,但究竟是以本地为准;以云端为准;还是以最新时间为准增量备份?有待进一步考察。
  • A:经过最近一段时间的使用,体验极佳,无感同步,准确度极高,导致我几乎不想去追问它的原理了,因为达到了同步达到了无感的程度。个人觉得是以文件夹最新时间为准做的备份。
  1. Vnote的保存文件的逻辑也令人疑惑,为什么一个文件就是保存不了,为什么文件夹里添加一个文件就没法索引?
  • A:第一个问题可能是自己移动文件的时候使用了剪切,已经解决了,第二个问题通过文件菜单的从外部文件新建笔记来把丢掉的笔记重新导入到当前文件夹。
  1. Vnote中在别的电脑新建的笔记,同步到了新的电脑上可能出现没有被软件索引的问题。
  • A:在文件夹区域右键点击“从磁盘中重新加载”即可。
如果觉得我的文章对你有用,请随意赞赏