【git操作】

几个重要概念:

本地工作区

本地版本库

远程仓库


echo "# tensorflow-rnn" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/kuanzi/tensorflow-rnn.git
git push -u origin master

Github使用.gitignore文件忽略不必要上传的文件

echo  “documents/” >> .gitignore

#过滤数据库文件、sln解决方案文件、配置文件  
*.mdb  
*.ldb  
*.sln  
*.config  

#过滤文件夹Debug,Release,obj  
Debug/  
Release/  
obj/  
然后调用git add. ,执行 git commit即可。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中:

  • !*.zip

  • !/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。

【Git】Git LFS 大文件提交扩展

https://blog.csdn.net/diandianxiyu_geek/article/details/50734335

Git 删除远程仓库文件,并忽略提交文件

https://my.oschina.net/fengzhi714/blog/845518

【情景描述】有一些文件发现不适合传到github上,但是已经上传了,所以希望在github上删除,但是希望在本地保留,所以在删除时要注意指定删除的是暂存区文件(--cached)

首先我们先删掉已经提交的文件

git rm -r --cached .settings;将暂存区的文件删除(-r表示递归删除,用于文件夹)

git commit -m 'delete .settings';提交并备注。

git push origin master ;提交到远程仓库。

在本地文件夹中添加.gitignore文件并添加需要忽略提交的文件

然后执行如下命令

git add .gitignore;提交至暂存区

git commit -m 'add .gitignore' ;提交至本地仓库

git push origin master ;提交至远程仓库

查看远程仓库就可以发现文件已被删除,并没有再次提交。


Git如何切换远程仓库地址

https://www.jianshu.com/p/df7c86926497

最简单的方法:git remote set-url origin url


工作区(自己乱写的代码)
工作区(Working Directory)
就是你在电脑里能看到的目录,比如我的 learngit 文件夹就是一个工作区:
git status看差异(包括已经已经改动的文件&本地仓库没有但工作区自己添加的文件)
use "git checkout -- <file>..." to discard changes in working directory(git checkout是丢弃了工作区的所有改动)
git diff(工作区域本地仓库的具体改动)
小结
现在总结一下今天学的两点内容:
初始化一个Git仓库,使用 git init 命令。
添加文件到Git仓库,分两步:
  • 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
  • 第二步,使用命令git commit,完成。(有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。)
小结
  • 要随时掌握工作区的状态,使用git status命令。(git commit/diff 都是版本库和工作区
  • 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
小结
现在总结一下:
  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
git checkout -- file 命令中的 -- 很重要,没有 -- ,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到 git checkout 命令。

本地仓库(如果没有commit,则保留的是你最开始clone的代码)
版本库(Repository)
工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD
小结
又到了小结时间。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令 git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令 git reset HEAD file ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考 版本回退 一节,不过前提是没有推送到远程库。】
git checkout 其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
远程仓库(大牛维护的代码)
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以, GitHub只要知道了你的公钥(公钥是放在github上的,私钥是放在自己的电脑上,可以有很多个也就有了多个私钥,当然不同的私钥是对应不同的公钥),就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

现在,我们根据GitHub的提示,在本地的 learngit 仓库下运行命令:
$ git remote add origin git @github . com: michaelliao/learngit.git
请千万注意,把上面的 michaelliao 替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。


当你从远程仓库克隆时,实际上Git自动把本地的 master 分支和远程的 master 分支对应起来了,并且,远程仓库的默认名称是 origin
(远程的{仓库}叫做origin,远程和本地的分支都是叫master)
添加后,远程库的名字就是 origin ,这是Git默认的叫法,
$ git push origin master
把本地 master 分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
小结
要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git
关联后,使用命令 git push -u origin master 第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!】


在Git里,这个分支叫主分支,即 master 分支。
HEAD 指向的就是当前分支。

git checkout -b dev
Switched to a new branch 'dev'
小结
Git鼓励大量使用分支:
查看分支: git branch
创建分支: git branch <name>
切换分支: git checkout <name>
创建+切换分支: git checkout -b <name>
合并某分支到当前分支: git merge <name>
删除分支: git branch -d <name>

git stash list
小结
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场 git stash 一下,然后去修复bug,修复后,再 git stash pop ,回到工作现场。


多人协作冲突

因此,多人协作的工作模式通常是这样:
  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果 git pull 提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream branch-name origin/branch-name
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。



git branch -a 查看远程分支

git branch 查看本地分支

git remote -v 查看远程分支的具体名字与url

git只更新单个文件夹
git checkout upstream/master -- egs/aishell



git只clone仓库中指定子目录和指定文件的实现

git的实现:基于sparse clone变通方法

参考:https://blog.csdn.net/xuyaqun/article/details/49275477


[root@vm_test backup]# mkdir devops

[root@vm_test backup]# cd devops/

[root@vm_test devops]# git init    #初始化空库

Initialized empty Git repository in /backup/devops/.git/

[root@vm_test devops]# git remote add -f origin http://[email protected]:hzy46/Char-RNN-TensorFlow.git   #拉取remote的all objects信息

Updating origin

remote: Counting objects: 70, done.

remote: Compressing objects: 100% (66/66), done.

remote: Total 70 (delta 15), reused 0 (delta 0)

Unpacking objects: 100% (70/70), done.

From http://192.168.1.1:90/scm/beeper/yunxxx_ops

 * [new branch]      master     -> origin/master

[root@vm_test devops]# git config core.sparsecheckout true   #开启sparse clone

[root@vm_test devops]# echo "devops" >> .git/info/sparse-checkout   #设置需要pull的目录,*表示所有,!表示匹配相反的

[root@vm_test devops]# more .git/info/sparse-checkout

devops

[root@vm_test devops]# git pull origin master  #更新

From http://192.168.1.1:90/scm/beeper/yunxxx_ops

 * branch            master     -> FETCH_HEAD

[root@vm_test devops]# ls

devops

[root@vm_test devops]# cd devops/

[root@vm_test devops]# ls

monitor_in_web  test.1

截图:



很赞的几篇参考文章(作为后辈,你遇到的很多问题前辈们早已遇到,并且很多已经有了完美的解决方案,做技术一定要勤于google啊):

http://stackoverflow.com/questions/600079/is-there-any-way-to-clone-a-git-repositorys-sub-directory-only

http://jasonkarns.com/blog/subdirectory-checkouts-with-git-sparse-checkout/

http://schacon.github.io/git/git-read-tree.html#_sparse_checkout

http://www.tuicool.com/articles/QjEvQvr





猜你喜欢

转载自blog.csdn.net/yifen4234/article/details/80146908
今日推荐