code: func calcSkippedRefs(remote string) []string {
  	cachedRemoteRefs, _ := git.CachedRemoteRefs(remote)
  	actualRemoteRefs, _ := git.RemoteRefs(remote)
  
  	// Only check for missing refs on remote; if the ref is different it has moved
  	// forward probably, and if not and the ref has changed to a non-descendant
  	// (force push) then that will cause a re-evaluation in a subsequent command.
  	missingRefs := tools.NewStringSet()
  	for _, cachedRef := range cachedRemoteRefs {
  		found := false
  		for _, realRemoteRef := range actualRemoteRefs {
  			if cachedRef.Type == realRemoteRef.Type && cachedRef.Name == realRemoteRef.Name {
  				found = true
  				break
  			}
  		}
  		if !found {
  			missingRefs.Add(cachedRef.Name)
  		}
  	}
  
  	if len(missingRefs) == 0 {
  		return nil
  	}
  
  	skippedRefs := make([]string, 0, len(cachedRemoteRefs)-missingRefs.Cardinality())
  	for _, cachedRef := range cachedRemoteRefs {
  		if !missingRefs.Contains(cachedRef.Name) {
  			skippedRefs = append(skippedRefs, "^"+cachedRef.Sha)
  		}
  	}
  	return skippedRefs
  }
docs: // calcSkippedRefs checks that locally cached versions of remote refs are still
  // present on the remote before they are used as a 'from' point. If the server
  // implements garbage collection and a remote branch had been deleted since we
  // last did 'git fetch --prune', then the objects in that branch may have also
  // been deleted on the server if unreferenced. If some refs are missing on the
  // remote, use a more explicit diff command.