git 常用 操作 及其 异常错误记录

重要的话再开头 打好基础,然后用图形化界面优先

git 作用域: 只能跟踪文本文件 比如TXT文件,所有的程序代码等等 可以告诉你每次的改动,比如在第5行加了一个单词“Linux”。而图片、视频这些二进制文件,只知道图片从100KB改成了120KB,改了啥不知道!

本地创建 及其 基本命令

git init命令把这个目录变成Git可以管理的仓库

添加文件到Git仓库,分两步:

git add <file>  可反复多次使用,添加多个文件

git commit -m <message>  完成

要随时掌握工作区的状态,使用git status命令。
git status告诉你有文件被修改过,用git diff可以查看修改内容

git log 
git log --pretty=oneline
可以查看提交历史,以便确定要回退到哪个版本


##### 版本穿梭:

HEAD指向的版本就是当前版本,Git允许在版本的历史之间穿梭,
git reset --hard commit_id
git reset --hard HEAD^  返回上一个

要重返未来,用git reflog查看命令历史

##### 管理修改:

git有暂存区概念 git add 后去暂存区  git commit后才去分支
git 不用git add到暂存区,就不会加入到commit中

###### 撤销:
场景1:改乱了工作区文件,未添加到暂存区,
直接用git checkout -- file

场景2:不但改乱了工作区文件,已添加到暂存区时
先git reset HEAD <file>,回到场景1,
再git checkout -- file 

git rm用于删除一个文件 如果文件已经被提交到版本库,那么你永远不用担心误删,
但只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!

github基本:

远程仓库 ssh key 设置 如果用户目录没有.ssh 
$ ssh-keygen -t rsa -C "youremail@example.com"

生成key 然后填到github

github 手动创建一个远程仓库

//关联远程仓库
$ git remote add origin git@github.com:username/learngit.git

###### 推送代码

$ git push -u origin master
第一次用-u 
每次本地提交后,只要有必要 就用上述命令 无需-u

你第一次使用Git的clone或者push命令连接GitHub时会有建立连接提示
如果担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致

##### 零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。

git clone git@github.com:username/xxx.git

https://github.com/xxx/xxx.git


.gitconfig 配置别名

[alias]
    co = checkout
    ci = commit
    br = branch
    st = status

git自己服务器搭建

在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。

搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。

假设你已经有sudo权限的用户账号,下面,正式开始安装。

第一步,安装git:

$ sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:

$ sudo adduser git
第三步,创建证书登录:

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库:

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

$ sudo chown -R git:git sample.git
第五步,禁用shell登录:

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash
改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。

管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。

摘自: https://www.liaoxuefeng.com/wiki/896043488029600

文件的忽略形式 https://www.cnblogs.com/huanyou/p/8439952.html

异常错误记录

新建本地分支后将本地分支推送到远程库或版本更新远程分支拉取时 使用git pull 或者 git push 的时候报错

gitThere is no tracking information for the current branch.

Please specify which branch you want to merge with.

See git-pull(1) for details

git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

git branch --set-upstream-to=origin/<branch> merged0.9.6

是因为本地分支和远程分支没有建立联系 (使用git branch 和 git branch -r 查看本地 和 远程

git branch --set-upstream-to=origin/远程分支的名字 本地分支的名字

Git出现冲突error: Your local changes to the following files would be overwritten by merge: xxx/...

用git pull来更新代码的时候,遇到了下面的问题:error: Your local changes to the following files would be overwritten by merge: xxx/xxx/xxx.php Please, commit your changes or stash them before you can merge. Aborting

通过git stash将工作区恢复到上次提交的内容,同时备份本地所做的修改,之后就可以正常git pull了,git pull完成后,执行git stash pop将之前本地做的修改应用到当前工作区。 git stash git pull git stash pop

git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。

git pull:拉取服务器上的代码;

git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。

git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。

git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

Git warning:LF will be replaced by CRLF in readme.txt的原因与解决方案

首先问题出在不同操作系统所使用的换行符是不一样的,下面罗列一下三大主流操作系统的换行符:

Uinx/Linux采用换行符LF表示下一行(LF:LineFeed,中文意思是换行);

Dos和Windows采用回车+换行CRLF表示下一行(CRLF:CarriageReturn LineFeed,中文意思是回车换行);

Mac OS采用回车CR表示下一行(CR:CarriageReturn,中文意思是回车)。

$ git config core.autocrlf
此命令会有三个输出,“true”,“false”或者“input”

为true时,Git会将你add的所有文件视为文本文件,将结尾的CRLF转换为LF,而checkout时会再将文件的LF格式转为CRLF格式。

为false时,line endings不做任何改变,文本文件保持其原来的样子。

为input时,add时Git会把CRLF转换为LF,而check时仍旧为LF,所以Windows操作系统不建议设置此值。


解决办法:

将core.autocrlf设为false即可解决这个问题,如果你和你的伙伴只工作于Windows平台或者Linux平台,那么没问题,不过如果是存在跨平台的现象的话,还是需要考虑一下。

但当 core autocrlf为true时,还有一个需要慎重的地方,当你上传一个二进制文件,Git可能会将二进制文件误以为是文本文件,从而也会修改你的二进制文件,从而产生隐患。

$ git config --global core.autocrlf true

记录你我
请先登录后发表评论
  • latest comments
  • 总共0条评论